2010-11-08 7 views
0

J'essaie de créer une fonction qui supprime le contenu entre accolades, mais je ne peux pas supprimer les accolades que je dois supprimer.Aide avec preg_match_all, supprime les accolades carrées

Voici comment le résultat:

Hello [there] blabla 

Se transforme en:

Hello <a href="http://blabla.com/index.php?id=there">linky</a> blabla 

Mon code actuel:

$txt='Hello [there] blabla'; 

$re1='.*?'; # Non-greedy match on filler 
$re2='(\\[.*?\\])'; # Square Braces 1 

if ($c=preg_match_all ("/".$re1.$re2."/is", $txt, $matches)) 
{ 
    $sbraces1=$matches[1][0]; 
    print "<a href='http://blabla.com/index.php?id=$sbraces1'>Linky</a> \n"; 
} 

Mon code actuel fait ceci:

Hello [there] blabla 

Se transforme en:

<a href='http://blabla.com/index.php?id=[there]'>Linky</a> 
+0

wouldnt ce soit préférable d'utiliser preg_replace de cette façon, vous n'avez pas à reconstruire votre chaîne? – Brady

Répondre

1

Une meilleure utilisation preg_replacepreg_replace_callback avec ce modèle:

\[(.*?)\] 

Voici la partie à l'intérieur des crochets est regroupée plutôt que l'ensemble support avec son contenu.

Avec preg_replace_callback vous pouvez alors écrire une fonction qui prend le match et il se transforme en un lien:

function callback_linkify($match) { 
    return '<a href="http://example.com/index.php?id='.urlencode($match[1]).'">Linky</a>'; 
} 

Et l'utilisation de ce modèle et la fonction de rappel:

$output = preg_replace_callback('/\[(.*?)\]/', 'callback_linkify', $str); 
0

capture la partie entre les supports dans un backreference:

\[([^\]]*)\] 

puis utilisez la première backreference au lieu de tout le match à sa place.

0

Si vous souhaitez faire correspondre les crochets et le contenu intérieur vous pouvez essayer d'utiliser quelque chose comme ceci:

"(\\[)([^\\]]*)(\\])"

J'espère juste que je les supports correctement saisies.

+0

Sauf si vous avez besoin de référencer individuellement les supports, il n'est pas nécessaire de les placer dans des groupes individuels. – Joey

+0

@Joey je suis d'accord. Je ne savais pas s'il préférait faire un remplacement sur les supports plutôt que sur toute la chaîne appariée. – zzzzBov

1

Que pensez-vous de cela?

EDIT:

<?php 
$string = 'Hello [there] blabla'; 
$re2='(\\[)([^\\]]*)(\\])'; # Square Braces 1 
$pattern = "/".$re2."/is"; 
$replacement = '<a href="http://blabla.com/index.php?id=$2">linky</a>'; 
echo preg_replace($pattern, $replacement, $string); 
?> 
+0

http://codepad.org/9pWmEdtA fonctionne bien :) – Shikiryu

+0

S'il vous plaît ne pas poster des réponses consistant uniquement en des liens vers d'autres sites. Il est correct d'inclure des liens vers des sites pastebin, mais votre réponse devrait avoir du sens sans eux. Si le code est trop long pour être affiché ici (et le vôtre ne l'est pas), extrayez les parties les plus importantes et ajoutez un texte explicatif. –

+0

@Alan Moore, je publierais le code ici mais chaque fois que je place le code dans les balises pré et code, les bits du code disparaissent. Placer le code dans des services tels que PastBin est la seule façon de garantir que tout le code est préservé – Brady