heinetz: kleiner Tipp zu regex

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

  1. Hallo Forum,

    hab's wohl schon gefunden: "non-greedy" Modifier

    beste gruesse,
    heinetz

  2. 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?

  3. @@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'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)