[RegEx] Zahlen und Dezimalzahlen finden

@rico

vielleicht schreibst du mal, welche Formate vorkommen können? Dein neues Format hattest du bisher nicht erwähnt. Ich nehme an, "160/195" soll heißen "160 oder 195" und "2000-2400" steht für "2000 bis 2400". Können solche Formate in allen drei Positionen vorkommen, also z.B.
"130/200x2000-2300x300/400" ?

@timestamp @Yaslaw
das soll funktionieren? Bei mir nicht

Gruß
Peter
 
Zuletzt bearbeitet:
Bei mir funktioniert es
PHP:
 <?PHP
  //
  // Text, der durchsucht werden soll
  //
  $subject = 'Produktname und verschiedene Attribute 15x160/195x2000-2400 Systemname';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '/[ ]([^ ]+x[^ ]+x[^ ]+)[ ]/';
  //
  // RegExp auswerten
  //
  $result = preg_match($pattern, $subject, $subpattern);
  //
  // Ergebnis ausgeben
  //
  echo '<p>Der verwendete Reguläre Ausdruck trifft auf den zu durchsuchenden Text '.
       (($result) ? '' : 'nicht ').'zu.</p>';
  //
  // Unterausdrücke ausgeben
  //
  echo '<pre>'.print_r($subpattern, TRUE).'</pre>';
?>
Code:
Der Reguläre Ausdruck trifft auf den zu durchsuchenden Text zu. 

Array
(
    [0] =>  15x160/195x2000-2400 
    [1] => 15x160/195x2000-2400
)

Hier mein Test
http://regexp-evaluator.de/evaluator/120a5de13c23e1735ecaeefde7e12f7e/#ergebnis

Nachtrag: Mit preg_replace musst du natürlich auch alles andere finden um es dann zu ignorieren. Also vorne und hinten noch je ein .* setzen
PHP:
 <?PHP
  //
  // Text, der durchsucht werden soll
  //
  $subject = 'Produktname und verschiedene Attribute 15x160/195x2000-2400 Systemname';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '/.*[ ]([^ ]+x[^ ]+x[^ ]+)[ ].*/';
  //
  // Ersatzstring
  //
  $replace = 'Format: \1';
  //
  // RegExp auswerten, Ersetzung durchführen
  //
  $result = preg_replace($pattern, $replace, $subject);
  //
  // Ergebnis ausgeben
  //
  echo '<p>Ergebnis: '.htmlspecialchars($result).'</p>';
?>
Code:
Format: 15x160/195x2000-2400
 
@Yaslaw
OK, dann vertraust du aber drauf, dass der Satz, in dem das Pattern vorkommt, eine bestimmte Form hat und dass das Format korrekt ist, da du keine Validierung vornimmst.


Wie wärs mit (ok, paranoid)
PHP:
$subject = "Produktname und verschiedene Attribute 14,5x60/190x1800-2000 Systemname sowiexxxbla  usw";

Mit deinem Pattern:
PHP:
 <?PHP
  //
  // Text, der durchsucht werden soll
  //
  $subject = 'Produktname und verschiedene Attribute 14,5x160/190x1800-2000 Systemname sowiexxxbla  usw';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '#.*[ ]([^ ]+x[^ ]+x[^ ]+)[ ].*#';
  //
  // RegExp auswerten
  //
  $result = preg_match($pattern, $subject, $subpattern);
  //
  // Ergebnis ausgeben
  //
  echo '<p>Der verwendete Reguläre Ausdruck trifft auf den zu durchsuchenden Text '.
       (($result) ? '' : 'nicht ').'zu.</p>';
  //
  // Unterausdrücke ausgeben
  //
  echo '<pre>'.print_r($subpattern, TRUE).'</pre>';
?>
Code:
Ergebnis: Format: sowiexxxbla

http://regexp-evaluator.de/evaluator/eae23a5a1f796fa84c8eaaa745be81e8/#ergebnis

Will man gleichzeitig auf Korrektheit des Formats prüfen, wird's halt komplizierter, z.B.:
PHP:
 <?PHP
  //
  // Text, der durchsucht werden soll
  //
  $subject = 'Produktname und verschiedene Attribute 14,5x160/190x1800-2000 Systemname sowiexxxbla  usw';
  //
  // Der Reguläre Ausdruck
  //
  $pattern = '#.*[ ]((\d+([,.]\d+)*([/-]\d+([,.]\d+)*)?x){2}\d+([,.]\d+)*([/-]\d+([,.]\d+)*)?)[ ].*#';
  //
  // RegExp auswerten
  //
  $result = preg_match($pattern, $subject, $subpattern);
  //
  // Ergebnis ausgeben
  //
  echo '<p>Der verwendete Reguläre Ausdruck trifft auf den zu durchsuchenden Text '.
       (($result) ? '' : 'nicht ').'zu.</p>';
  //
  // Unterausdrücke ausgeben
  //
  echo '<pre>'.print_r($subpattern, TRUE).'</pre>';
?>

http://regexp-evaluator.de/evaluator/65d614c00824440742e11bb20f29cd02/#ergebnis

Code:
Ergebnis: 14,5x160/190x1800-2000
Gruß
Peter
 
Du musst wissen was daherkommen kann und wie paranoid die filtern musst. Ich ging von deinen Beispielen aus. Wenn du natürlich mit jedem deiner Postings einen neuen Sonderfall bringst können wir uns noch ewig im Kreise drehen.
 
@Yaslaw
also, wenn ich ein Format prüfe, dann validiere ich auch. Dein Pattern lässt viel zu großen Freiraum. Wenn man paranoide Strings wie in meinem Beispiel ausschließen kann, dann reicht deine Lösung wohl. Aber das ist eine Frage der Herangehensweise.

Gruß
Peter
 
Vor allem der Anforderungen. Und diese kenne ich nicht.
Ich gebe ja auch zu dass dein letztes Beispiel mit meinem Pattern durchrasselt. Kein Problem, dann macht man ein schärferes Pattern. Die Frage ist nur, wie detailiert muss das Pattern sein. Und das beantwortet die Anforderungen.

Kommen diese Texte aus einem in sich geschlossenen System und man weiss was einem in etwa erwartet? Oder kann dieser Text von Kreti und Pleti erstellt werden?

Wenn mein Pattern zu lasch ist, dann kommen ggf mehr Werte durch als erwünscht.
Wenn mein Pattern zu strikt ist und die Formatvarianten nicht zu 100% bekannt sind, dann filtere ich ggf auch Werte aus die ich eigentlich haben möchte.

Den richtigen Schnitt, den musst du selber finden.
 
Zurück