2009-07-31 4 views
0

Je me demande ce que l'expression rationnelle pour un eregi_replace serait nécessaire pour attraper une chaîne qui n'est pas contenue dans un attribut alt.regex qui ne trouvera pas de modèle dans le texte alt pour php eregi_replace

par exemple. Il faut trouver et remplacer John Doe dans:

"John Doe est né le ..."

mais pas rechercher/remplacer quand John Doe dans un tag par exemple:

<img src="/jd.jpg" alt="John Doe at the beach" /> 
+1

Faut-il être 'eregi_replace'? Les fonctions 'ereg [i] _' sont déconseillées en faveur des fonctions' preg_' beaucoup plus puissantes. Avec 'preg_replace', cela pourrait être possible. –

+0

sûr ... Je vais avec n'importe quel outil peut faire le travail. :-) – Ian

Répondre

1

Si je voulais remplacer « John Doe » si ce n'est pas dans une balise, je ferais ceci:

$str = preg_replace('/John Doe(?![^<>]*+>)/i', $new_name, $str); 

(?![^<>]*+>) est un negat ive lookahead; il dit "s'il y a des crochets en avant de ce point, le premier n'est pas un crochet de fermeture." Ce n'est pas infaillible, car les valeurs d'attribut peuvent contenir des chevrons, mais dans mon expérience, ils le font rarement. Les expressions rationnelles sont fondamentalement incompatibles avec le langage HTML; même avec les fonctionnalités avancées offertes par la suite preg_, comme lookarounds et possessive quantifiers, vous devez souvent compter sur des hypothèses simplificatrices comme sans crochets dans les valeurs d'attribut. Je n'essaierais même pas ce travail avec les fonctions ereg_ beaucoup plus limitées.

+0

Cela semble avoir fait l'affaire! Merci. – Ian

+0

Utilisation soignée de lookahead de largeur nulle. –

0

Vous » J'ai atteint les limites de regex. Vous aurez besoin d'un analyseur personnalisé pour cela. balises peuvent être imbriquées, et regex ne peuvent pas correspondre à des modèles comme

<b> 
<<b>> 
<<<b>>> 

sans motifs correspondant comme

<b>> 
<<b> 
<<b>>> 

etc

+0

Mais si nous cherchons du texte dans un élément, il n'y aurait pas d'imbrication. Un élément est dans <...> – Ian

Questions connexes