PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [REGEXP] Quantifier x ODER y mal


Captain America
2005-11-14, 20:16:07
Snippet zum extrahieren von Daten (Datum), in PHP mit PREG (preg_match_all()):


$patterns[] = '[0-9]{1,2}\.\s*[a-zA-Z]+\.?\s+[0-9]{4}}'; // 1. Februar 2006, 1. Feb 2006, 1. Feb. 2006, euro long


Man beachte das Ende, welches vierstellige Jahresangaben findet: [0-9]{4}. Nun möchte ich dass er 2- oder 4-stellige findet, aber nicht 3-stellige, somit scheidet [0-9]{2,4} aus. Jeman ne Idee wie man das lösen kann, ohne dass man ein subset mit ([0-9]{2}|[0-9]{4}) einbaut? Das zerschiesst mir den Rest des Codes, weil ich dann subsets Indices ändern muss.

Ausserdem tricky: [0-9]{2,4} funktioniert nicht, weil das Pattern Ungreedy ist.

Wer das löst bekommt nen Kuss von unserer Göttin Asyan! :uup:

DocEW
2005-11-14, 20:19:43
Kannst natürlich (unschön) zwei Arrays füllen: Die 4-stelligen Jahreszahlen, danach die 2-stelligen, und dann vereinigen. Notfalls halt.

Captain America
2005-11-14, 20:28:27
Kannst natürlich (unschön) zwei Arrays füllen: Die 4-stelligen Jahreszahlen, danach die 2-stelligen, und dann vereinigen. Notfalls halt.

Wäre eine Option. Nur müsste ich dann den Code clonen, der das ausliesst und in iso 9660 umwandelt (2006-02-01). Irgend wie doof, habe gehofft es geht von regexp seite aus.

DocEW
2005-11-14, 21:40:01
(...) Das zerschiesst mir den Rest des Codes, weil ich dann subsets Indices ändern muss.
Vielleicht kannst du das nochmal erläutern..?

Captain America
2005-11-14, 22:28:22
$patterns[] = '[0-9]{1,2}\.\s*[a-zA-Z]+\.?\s+([0-9]{4}|[0-9]{2})}'; // 1. Februar 2006, 1. Feb 2006, 1. Feb. 2006, euro long
$patterns[] = '[0-9]{1,2}\.[0-9]{1,2}\.([0-9]{4}|[0-9]{2})'; // 1.2.2006, euro short
$patterns[] = '[0-9]{4}-[0-9]{2}-[0-9]{2}'; // 2006-02-01, iso

$pattern = "/(" . implode(")|(", $patterns) . ")/U";
preg_match_all($pattern, $val, $match, PREG_PATTERN_ORDER);

for($j = 0; isset($match[1]) && $j < sizeof($match[1]); $j++)
{
if(!empty($match[1][$j])) // match found, euro long


$match[x] <-- das ändert sich, gibt 3 zweige, hab keinen bock das rumzufriemeln, wenn weitere subsets dazukommen.