2010-02-01 5 views
2
$test = "<div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>"; 

$test = preg_replace("/<div(.*)#uniquetag#(.*)<\/div>/i", "#uniquetag#", $test); 

Je veux que le résultat soitPHP preg_replace - Expression régulière ne comprenant pas une phrase

$test = "#uniquetag# <div>Keep this</div>"; 

Mais il retourne

$test = "#uniquetag#"; 

Je pense que je sais pourquoi. (. *) est gourmand et il étend la recherche jusqu'à la fin. Mais je ne peux pas comprendre quelle est la bonne façon de le faire.

Mise à jour:

grâce à ghostdog74 spéciales. Vieux problème résolu. Un nouveau problème est connu ....

$test = "<div></div> <div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>"; 

$test = preg_replace("/<div(.*)#uniquetag#(.*?)<\/div>/i", "#uniquetag#", $test); 

résultat attendu est

$test = "<div></div> #uniquetag# <div>Keep this</div>"; 

Mais il se révèle être

$test = "#uniquetag# <div>Keep this</div>"; 

Encore une fois, je crois que c'est à cause de la première (. ). Le changer à (.?) N'aidera pas aussi. Besoin de penser à un moyen d'exclure.

Répondre

3

changement (.*) à (.*?)

+0

Cela fonctionne, mais je fais face à un autre problème. S'il y a une balise div avant ce code, elle engloutira tous les divs avant elle. –

+0

montrez votre exemple dans votre question et votre résultat attendu – ghostdog74

3

Dans la majorité des cas, je recommande fortement d'utiliser un analyseur HTML (tel que this one) pour obtenir ces liens. Utiliser des expressions régulières pour analyser HTML va poser problème car HTML n'est pas régulier et vous n'aurez pas de cas de fin à considérer.

Voir here pour plus d'informations.

+2

HTML parseurs ne sont pas toujours la meilleure façon lorsque vous travaillez avec le code HTML. Si le code sur lequel il travaille est toujours formaté exactement de la même manière (par exemple parce qu'il l'a généré quelque part auparavant), alors RegExp est un moyen simple et rapide d'effectuer des changements simples. – poke

+0

Je pense que c'est un commentaire juste, et le pragmatisme est un grand principe directeur. J'ai modifié pour tenir compte de cette réserve. –

Questions connexes