2011-04-16 3 views
2

Je cherche une chaîne d'expressions régulières qui peuvent trouver un mot ou une chaîne regex PAS entre balises html.PHP: remplacer Regex tout en ignorant le contenu entre les balises html

que je veux remplacer (alpha | beta) dans: les deux premières lettres de l'alphabet grec sont alpha et <b>beta</b>

Je veux seulement à remplacer alpha, car bêta est entre <> tags. Donc ignorer (<(.*?)>(.*?)<\/(.*?)>)

:)

+0

Pensez à utiliser le bouton {} lorsque vous écrivez votre question – Calum

+0

Désolé, vient de rejoindre ce site. Va l'utiliser dans le futur. :) –

+0

C'est bon :) c'est juste que si vous essayez d'utiliser des balises, cela pourrait ne pas fonctionner sans l'encapsuleur de code. – Calum

Répondre

3

Je n'ai pas testé la logique utilisée dans cette page - http://www.phpro.org/examples/Get-Text-Between-Tags.html Mais je peux confirmer le point logique fait en haut de la page en gros caractères gras que vous dit shouldn » t faites ce que vous essayez de faire avec regex.

Html n'est pas uniforme et les cas de bords vous mordre toujours à l'arrière si vous utilisez des expressions régulières pour gérer le contenu de ces balises dans n'importe quelle situation du monde réel. Donc, sauf si votre balisage est extrêmement simpliste, uniforme, 100% précis, ne contient que html (pas css, javascript ou garbage) alors votre meilleur pari est une bibliothèque dom parser.

Et vraiment beaucoup de bibliothèques dom parser ont aussi des problèmes mais vous serez en avance sur les homologues de la regex. La meilleure façon d'obtenir le contet de texte des balises est de rendre le code HTML dans un navigateur et d'accéder à la propriété innerText du nœud dom donné (ou d'avoir une copie humaine et de coller le contenu manuellement) - mais ce n'est pas toujours une option : D

1

il est peut-être la façon « mauvais », mais cela fonctionne: quand je dois faire quelque chose de semblable, j'ai fais un preg_replace_callback pour trouver ce que je ne pas veulent correspondre et encoder avec quelque chose comme base64 .

Ensuite, je peux heureusement exécuter un preg_replace ordinaire sur le résultat, sachant qu'il n'a aucune chance de faire correspondre les chaînes que je veux ignorer. Puis déchiffrer en utilisant le même modèle dans preg_replace_callback, cette fois en envoyant les matches à base64 décodé. Je le fais souvent en ajoutant automatiquement des liens de mot-clé ou de glossaire ou des infobulles à un texte - je brouille les balises HTML elles-mêmes pour que je n'essaie pas de créer un lien ou une info-bulle dans le titre d'une balise d'ancrage tout aussi ridicule, par exemple.

Questions connexes