kleiner Tipp zu regex
heinetz
- php
0 heinetz0 suit0 Gunnar Bittersmann
Hallo Forum,
ich durchsuche einen String nach Links, die einem bestimmten Muster folgen und manipuliere diese mit preg_replace_callback. Das Suchmuster sieht so aus:
'/(<a.*href=")(./?site_id=|?site_id=)(\d+)([^"]?)([^"]*)/'
Wobei der relevante Teil folgender ist:
'/(<a.*href=")/'
Nun bin ich auf einen Bug gestossen:
<a href="./?site_id=1">test a</a>
... passt in das Muster wie erwartet.
$1 = '<a href=';
$2 = '"./?site_id=';
$3 = 1
<a href="./?site_id=1">test a</a> <a href="./?site_id=2">test b</a>
... passt auch
$1 = '<a href="./?site_id=1">test a</a> <a href="';
$2 = '"./?site_id=';
$3 = 2
Was ist der Ansatz, das Muster anzupassen?
danke für Tipps und
beste gruesse,
heinetz
Hallo Forum,
hab's wohl schon gefunden: "non-greedy" Modifier
beste gruesse,
heinetz
Was ist der Ansatz, das Muster anzupassen?
Kennst du das Sprichwort "Die Gier ist was schiachs."? :)
Warum nutzt du keinen XML- oder HTML/DOM-parser um dein Problem zu lösen?
@@heinetz:
nuqneH
'/(<a.*href=")(./?site_id=|?site_id=)(\d+)([^"]?)([^"]*)/'
Du willst '<ahref="' und '<axhref="' erkennen, nicht aber '<a href="' und '<a
href="'?
Zwischen '<a' und 'href="' kann beliebiger Whitespace stehen, auch mehrere Zeichen hintereinander. Ebenso links und rechts des '='.
Anführungszeichen können einfache oder doppelte sein, aber paarweise.
'/(<a.*href=")/'
Der sähe eher so aus: '/(<a[\s\t\n]+href[\s\t\n]*=[\s\t\n]*['"])/'.
Was ist der Ansatz, das Muster anzupassen?
Wie suit sagte, einen XML- oder HTML/DOM-Parser verwenden. Schönen Gruß von Zawinski.
Qapla'