2010-11-16 4 views
1

Dans le code ci-dessous je veux remplacer esperluette simple avec « et » tout en ignorant les esperluette qui sont utilisés dans le cadre d'une des entités html (ex: ")Reg exp pour remplacer esperluette mais pas des entités html

I ai testé mon expression & (?! ([\ w \ n] {2,7} | # [\ d] {1,4});) à http://www.gskinner.com/RegExr/ et cela correspond à ce que je veux. Cependant, lorsque j'exécute ce code, les résultats sont vierges.

$content = "" Apples & Oranges ""; 
$content = preg_replace("/&(?!([\w\n]{2,7}|#[\d]{1,4});)/g","and",$content); 

echo $content; 

Mon approche est-elle erronée ou ai-je un problème de syntaxe?

Répondre

1

Retirez le drapeau g et cela devrait fonctionner correctement.

Notez qu'il me semble que vous attendez et esperluette des espaces entourés, de sorte que le suivant pourrait être une solution simplifiée:

$content = preg_replace("/\s/&\s/"," and ",$content); 

Bien que je me rends compte que cela pourrait permettre le texte mal orthographié pour provoquer le codage les erreurs. S'il manque un espace

+0

ne fait pas vraiment la bonne chose à moins que la bonne chose était destinée à être une mauvaise idée. – muhmuhten

+0

Suppression de la g permis le code pour faire ce que je l'ai prévu de faire (peu importe si c'est une mauvaise idée ou non) – Susan

+0

ça marche avec, disons, la chaîne '" 1 & 2 & 3 "'? Je pense que ça tomberait dans la portée de ce que tu voulais. – muhmuhten

1

Vous ne pouvez pas le faire de manière cohérente. Comment sauriez-vous si quelqu'un y compris & amp; veut qu'il imprime littéralement "& amp;" ou une esperluette? Ne tentez pas d'échappement mixte ... en bas de ce chemin se trouve des attaques de script inter-site.

(Et curieusement, stackoverflow fait aussi semi-encodage, et il a brisé mon affectation. Cretins.)

+0

C'est dans un environnement backend/contrôlé, donc je sais quel contenu attendre et une impression littérale de & amp ne serait jamais nécessaire. – Susan

1

PHP-g ne sais pas modificateur, il suffit de retirer g après la déclaration de regexp. Cela fonctionne:

$content = "" Apples & Oranges ""; 
$content = preg_replace("/&(?!([\w\n]{2,7}|#[\d]{1,4});)/","and",$content); 

echo $content; 
Questions connexes