2010-08-09 7 views
2

J'utilise regex pour créer des balises html en texte brut. comme celui-ciPlusieurs expressions régulières interfèrent

boucle

$SearchArray[] = "/\b(".preg_quote($user['name'], "/").")\b/i"; 
$ReplaceArray[] = '<a href="'.$user['url'].'">$1</a>'; 

-

$str = preg_replace($SearchArray, $ReplaceArray, $str); 

Je suis à la recherche d'un moyen de ne pas correspondre $user['name'] dans une balise.

Répondre

3

Vous pouvez utiliser preg_replace_callback()

pour 5.3+:

$callback = function($match) using ($user) { 
    return '<a href="'.$user['url'].'">'.$match[1].'</a>'; 
}; 
$regex = "/\b(".preg_quote($user['name'], "/").")\b/i"; 
$str = preg_replace_callback($regex, $callback, $string); 

pour 5.2+:

$method = 'return \'<a href="'.$user['url'].'">\'.$match[1].\'</a>\';'; 
$callback = create_function('$match', $method); 
$regex = "/\b(".preg_quote($user['name'], "/").")\b/i"; 
$str = preg_replace_callback($regex, $callback, $string); 
+0

Je n'ai jamais utilisé un rappel comme ça en php. J'utilise PHP 5.2 .. puis-je mettre ce code dans la boucle et la boucle pour 200 fois? – Remi

+0

Vous pourriez ... La performance peut être un problème (vous pourriez être mieux avec 'str_ireplace()', mais vous ne serez pas en mesure de garder le cas du nom) ... – ircmaxell

+0

j'ai encore des problèmes avec pour obtenir une boucle de travail en PHP 5.2. l'erreur est "erreur de syntaxe, inattendue" <'dans la fonction créée à l'exécution ". Les méthodes $ et $ regex sont différentes à chaque fois. Pouvez-vous me donner un exemple de votre code dans une boucle? – Remi

1

Le problème est que vous faites plusieurs passes sur le document, remplaçant un nom d'utilisateur différent dans chaque passe, et vous avez peur de remplacer involontairement un nom à l'intérieur d'un tag créé lors d'un passage précédent, n'est-ce pas?

Je voudrais essayer de faire une passe tous les remplacements, en utilisant preg_replace_callback comme @ircmaxwell suggéré, et un regex qui peut correspondre à un nom d'utilisateur légal. Dans la fonction de rappel, vous recherchez la chaîne correspondante pour voir si c'est un nom d'utilisateur réel. Si c'est le cas, renvoyez le lien généré; sinon, renvoie la chaîne correspondante pour la réinsertion.

+0

Correct. Pourriez-vous me montrer un exemple? J'utilise php 5.2 – Remi

+0

Quelles sont les restrictions sur les noms d'utilisateur? Quels personnages sont légaux? Y a-t-il une exigence de longueur minimale ou maximale? Y a-t-il une restriction supplémentaire sur le premier personnage? Par exemple, le nom doit-il commencer par une lettre? Nous avons besoin de cette information pour créer la regex. –

+0

la regex "/\b(".preg_quote($user['name ']," /").")\b/i "fonctionne pour moi la vitesse n'est pas importante. Il y a aussi un autre mot que je veux assortir avec son propre regex. – Remi

0

Il semble que vous essayez d'ajouter un groupe d'ancres à un document. Avez-vous pensé à utiliser SimpleXML? Cela suppose que les balises d'ancrage font partie d'un document xhtml plus volumineux.

//$xhtml_doc is some xhtml doc's path 
$doc = simplexml_load_file($xhtml); 
//NOTE: find the parent element for all these anchors (maybe with xpath) 
//example: $parent = $doc->xpath('//div[@id=parent]'); 
foreach($user as $k => $v){ 
    $anchor = $doc->addChild('a', $v['name']); 
    $anchor->addAttribute('href', $v['url']); 
} 
return $doc->asXML(); 

simpleXML m'aide beaucoup dans ces situations. Ce sera beaucoup plus rapide que regex, même si ce n'est pas exactement ce que vous voulez faire.