Otto: preg_match bzw preg_match_all

Guten Abend an alle,

wie der titel es schon sagt, hab ich ein Problem mit dem Preg_match() befehl.

also ich habe mal folgendes zum testen gemacht:

<?php
$text = "[url]http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de[/url]";

preg_match_all("=[url](.*)[/url]=i", $text, $ausgabe);

echo '<pre>';
for($i = 0; $i <= 5; $i++)
{
    for ($z = 0; $z <= 5; $z++)
    {
        echo $ausgabe[$i][$z]."<br>";
    }
}
echo '</pre>';
?>

nur leider gibt er nicht die url aus, die ich gern hätte, sprich http://gehdahin.de.vu und www.test.de

wo liegt mein fehler, und was könnte ich noch verbessern.
ps: kennt jmd ne gute deutsche seite, wo das gut mit preg_match(_all) erklärt wird? google gab mir nix gutes, was ich gebrauchen konnte. achja, worin liegt denn der unterschied zw. preg_match und preg_match_all.

mfg
Otto

  1. heyho,

    preg_match_all("=[url](.*)[/url]=i", $text, $ausgabe);

    ich denke, du musst die erste und letzte gruppe auch noch als gruppe schreiben.

    preg_match_all("=([url])(.*)([/url])=i", $text, $ausgabe);

    andi

    1. hiho

      ich denke, du musst die erste und letzte gruppe auch noch als gruppe schreiben.
      preg_match_all("=([url])(.*)([/url])=i", $text, $ausgabe);

      ne , leider war es das auch nicht, dann bekomm ich das hier heraus.
      [url]http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de[/url][url]http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de[/url]

      will aber nur das zwischen [url] und [/url]

      mfg
      Otto

      1. preg_match_all("=([url])(.*)([/url])=i", $text, $ausgabe);

        so gehts aber
        preg_match_all("=([url])([a-zA-Z/.:]+)([/url])=", $text, $ausgabe);

        andi

        1. nen bindestrich musste noch mit reinschreiben - der ist ja auch erlaubt :)

          andi

  2. Hallo Otto,

    $text = "[url]http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de[/url]";

    preg_match_all("=[url](.*)[/url]=i", $text, $ausgabe);

    Dir ist klar, dass $ausgabe hierbei folgendes ist:

    $ausgabe[0][0] = "[url]http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de[/url]"
               [1] = "http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de";

    oder?

    Ansonsten muss dein BBCode-Treffstringteil so heißen:

    "=[url](.*)(?![/url])[/url]=i"

    Oder irgendwie so. Ansonsten findet er nämlich immer nur die "äußersten" teile...

    WauWau
    Warum du auch immer "=" als Delimitter oder wie die dinger heißen benutzt.

    --
    ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
    E-Mail WauWau: [mailto:der-wauwau@gmx.de]
    1. hallo,

      Dir ist klar, dass $ausgabe hierbei folgendes ist:

      $ausgabe[0][0] = "[url]http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de[/url]"
                 [1] = "http://gehdahin.de.vu[/url]  und dann noch [url]www.test.de";

      jo, das weis ich, deshalb hatte ich ja ein problem.

      Ansonsten muss dein BBCode-Treffstringteil so heißen:

      "=[url](.*)(?![/url])[/url]=i"

      das geht leider auch nicht, da bekomm ich gar nix raus. :-(

      Warum du auch immer "=" als Delimitter oder wie die dinger heißen benutzt.

      das hab ich irgendwo mal gelesen. eigentlich ist es doch völlig egal
      welches man benutzt, solang es glaub nicht gefiltert werden soll,
      oder nicht ?!

      mfg
      Otto

      1. jo, das weis ich, deshalb hatte ich ja ein problem.

        ... und warum nimmt es den genzen string?

        *verkehertherum geschriebene antwort:*
        weil der '.' gierig ist und deswegen das end-tag mitfrisst. also musste deinen suchstring präziser machen (siehe andere antwort).

        andi

        1. Hallo andi_b,

          jo, das weis ich, deshalb hatte ich ja ein problem.

          ... und warum nimmt es den genzen string?

          *verkehertherum geschriebene antwort:*
          weil der '.' gierig ist und deswegen das end-tag mitfrisst. also musste deinen suchstring präziser machen (siehe andere antwort).

          Jo, stimmt, ich komm mal wieder mit sonstwas an...

          =([url])([a-zA-Z/.:-]+)([/url])=

          wär natürlich toll. Als "Anfängerlösung" hätte auch

          =[url]([[]*)[/url]=i

          gereicht, aber darauf bin ich ja auch net gekommen *strunz*...

          gestrunzelte grüße,

          WauWau

          --
          ss:) zu:) ls:& fo:) de:] va:) ch:° n4:( rl:( br:^ js:| ie:% fl:{ mo:|
          E-Mail WauWau: [mailto:der-wauwau@gmx.de]