J'ai un contenu HTML comme celui-ci:

<p>The bedding was hardly <strong>able to cover</strong> it and seemed ready to slide off any moment.</p>

Voici une version complète du HTML. http://collabedit.com/gkuc2

J'ai besoin de rechercher la chaîne hardly able to cover (juste un exemple), je veux ignorer toutes les balises HTML à l'intérieur de la chaîne que je recherche. Parce que dans le fichier HTML, il y a des balises HTML à l'intérieur de la chaîne et une simple recherche ne la trouvera pas.

Le cas d'utilisation est le suivant: j'ai deux versions d'un fichier:

  • Un fichier HTML avec du texte et des balises
  • Le même fichier mais avec le texte brut uniquement (suppression des balises et des espaces supplémentaires)

La sous-chaîne que je veux rechercher (l'aiguille) provient de la version texte (qui ne contient aucune balise HTML) et je veux trouver sa position dans la version HTML (le fichier qui a des balises).

Quelle est l'expression régulière qui fonctionnerait?

1
Amaynut 13 juil. 2015 à 19:55

2 réponses

Meilleure réponse

Mettez ceci entre chaque lettre:

(?:<[^>]+>)*

Et remplacez les espaces par:

(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*

Comme:

h(?:<[^>]+>)*a(?:<[^>]+>)*r(?:<[^>]+>)*d(?:<[^>]+>)*l(?:<[^>]+>)*y(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*a(?:<[^>]+>)*b(?:<[^>]+>)*l(?:<[^>]+>)*e(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*t(?:<[^>]+>)*o(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*c(?:<[^>]+>)*o(?:<[^>]+>)*v(?:<[^>]+>)*e(?:<[^>]+>)*r

Vous n'avez besoin que de ceux entre chaque lettre si vous souhaitez autoriser les balises à casser des mots, comme: This is b<b>old</b>

C'est tout sans le saut de lettre:

hardly(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*able(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*to(?:\s*<[^>]+>\s*)*\s+(?:\s*<[^>]+>\s*)*cover

Cela devrait fonctionner dans la plupart des cas. Cependant, si le code HTML est mal formé et que le n'est pas codé au format HTML, vous pouvez rencontrer des problèmes. Il peut également se briser sur des blocs de script ou d'autres éléments avec des sections CDATA.

3
Robert McKee 13 juil. 2015 à 17:43

Essayez d'enregistrer le texte dans une variable ou quelque chose, puis supprimez toutes les balises et effectuez une recherche normale dans celle-ci. Vous pouvez utiliser une simple fonction php strip_tags ().

MODIFIER: Vous pouvez donc essayer de rechercher le premier et le dernier mot (ou juste d'abord et ensuite jouer avec le reste du résultat) pour localiser la chaîne, puis analyser le résultat et supprimer les balises et vérifier si c'est celle que vous recherchez. Comme utiliser regex: à peine. couvrir ou même à peine. $ Et en enregistrant l'emplacement de chaque résultat. Ensuite, utilisez strip_tags () sur les résultats et analysez chaque résultat si c'est celui que vous voulez. Je sais que c'est une solution un peu étrange, mais vous pouvez éviter les expressions régulières sans fin, etc.

0
Hitokage 13 juil. 2015 à 17:44