2010-11-20 5 views
-1

Comment faire pour preg_replace() avec une seule ligne pour atteindre les sorties suivantes ?regex php: "se débarrasser [link1] se débarrasser [link2] ... se débarrasser" - problème 'se débarrasser' quand il n'y a pas [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 ""; 

J'ai essayé les éléments suivants, qui fonctionne par exemple $ chaine1 mais pas pour chaîne2 $ ci-dessus:

$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); 

Je pense que les groupes non-capture (?:...) pourrait fonctionner, mais je ne peux pas le comprendre ...

+0

Je suis confus par ce "se débarrasser". Est-ce toujours "se débarrasser"? Ou peut-il être autre chose? C'est vague. – BeemerGuy

+0

et vous dites qu'il échoue lorsqu'il n'y a pas de [[liens] ", eh bien, il n'y aura pas de sortie ... quel est l'échec? – BeemerGuy

+0

'se débarrasser' pourrait être n'importe quel texte non-encadré, disons "texte bla bla bla texte bla [link1] bla bla [linktextofanysort2] texte bla bla". Tout plus clair maintenant? - J'ai modifié la question originale, voir ci-dessus: ... – ajo

Répondre

0

Pourquoi pas juste?

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

Edit: votre regex ne fonctionnera pas, preg_replace remplacera tout le texte adapté de sorte que vous devrez rendre le texte avant et après les arguments de lien aussi ... Le long des lignes de:

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

Ça marche! "soleil levant (cf [幹]) + [乙] impair" devient correctement lié "[幹] [乙]" – ajo

+0

Oui mais vous ne voulez remplacer que le lien, de cette façon il supprime également le texte que vous ne voulez pas affecter ... –

+0

?? la sortie comme mon dernier commentaire est exactement comme je le veux, mais je lutte avec la sortie vide s'il n'y a pas de constructions [.] incluses .... – ajo