preg_match bzw preg_match_all
Otto
- php
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
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
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
preg_match_all("=([url])(.*)([/url])=i", $text, $ausgabe);
so gehts aber
preg_match_all("=([url])([a-zA-Z/.:]+)([/url])=", $text, $ausgabe);
andi
nen bindestrich musste noch mit reinschreiben - der ist ja auch erlaubt :)
andi
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.
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
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
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