2010-11-20 11 views
-1

Wie preg_replace() mit einer einzigen Zeile, um die folgenden Ausgänge zu erreichen ?Regex PHP: "loswerden [link1] loswerden [link2] ... loswerden" - Problem 'loswerden', wenn es keine gibt [link]

$string1="get rid1 [link1] get rid2 [link2] ..."; // any number of links 
echo "[<a href=link1>link1</a>][<a href=link2>link2</a>]"; 
$string2="get rid any text any text get rid"; // = no links: is a possibility 
echo ""; 

Ich habe versucht, die folgende, die beispielsweise $ string1 funktioniert aber nicht für $ string2 oben:

$regex="/". 
"[^\[\]]*". // the non-bracketed text before: -> eliminate 
"\[(.*?)\]". // the bracketed text: [.]: -> convert into links 
"[^\[\]]*"; // get rid of non-bracketed text after: -> eliminate 
"/"; 
echo preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1); 

Ich denke nicht-einfangenden Gruppen (?:...) funktionieren könnte, aber ich kann es nicht heraus ...

+0

Ich bin verwirrt durch diese "loswerden". Ist es immer "loswerden"? Oder kann es etwas anderes sein? Es ist unklar. – BeemerGuy

+0

und Sie sagen, es scheitert, wenn es keine "[Links]" gibt, dann wird es keine Ausgabe geben ... was ist das Scheitern? – BeemerGuy

+0

"loswerden" könnte jeder Text ohne Klammern sein, sagen "bla bla blah Text blah Text [link1] bla bla [linktextofanysort2] blah Text blah". Irgendwie klarer jetzt? - Ich habe die ursprüngliche Frage geändert, siehe oben: ... – ajo

Antwort

0

Warum nicht nur wenn?

if ($output = preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1)) 
echo $output; 

Edit: Ihre regex wird nicht funktionieren, preg_replace ALL des angepassten Text ersetzen wird, so dass Sie den Text vor und nach den Link Argumente machen müsste ... Nach dem Vorbild der:

preg_replace("(text we dont want to replace)(text we do want to replace)(more junk text)",$1." altered $2 = ".$2." ".$3, $string1) 

.

$output = preg_replace($regex,'<a href=jp.php?jp=\1>[\1]</a>',$string1); 
if ($output != $string1) 
echo $output; 
+0

Es funktioniert! "aufgehende Sonne (cf [幹]) + [乙] ungerade" wird richtig verknüpft "[幹] [乙]" – ajo

+0

Ja, aber Sie möchten nur den Link ersetzen, so löscht er auch den Text, den Sie nicht möchten beeinflussen ... –

+0

?? die Ausgabe als mein letzter Kommentar ist genau, wie ich es will, aber ich kämpfe mit der leeren Ausgabe, wenn keine "[.]" -Konstrukte enthalten sind. – ajo