bonjour à tous,
ma question de débutant :comment indiquer une limite de mot dans une regex, quand le mot commence ou fini par une entité décimale &.#...;
(j'écris les entités citées ci-dessous avec un point entre & et #)
Dans un script php, j'ai besoin de remplacer un mot dans un texte html issu d'une variable (il n'y a pas de base de données). Ce mot peut comporter des accents sous deux formes possibles en raison des différents éditeurs utilisés pour la rédaction du texte : exemple é et &.#233;
Aucun soucis avec les caractères accentués (é)
par contre, les entités de type &.#233; empêchent l'interpretation de la limite de mot lorsqu'ils sont placés au début ou à la fin du mot. Du coup, tout se passe comme si les \b de la regex n'étaient pas présents.
si j'utilise un logiciel testeur de regex (exemple regex coach), je constate aussi le problème.
Exemple, cas du mot commençant par un caractère accentué :
dans le texte, je place : établi, rétabli, &.#233;tabli, r&.#233;tabli
en testant la regex : \b(établi|&.#233;tabli)\b
les caractères accentués "normaux" ne posent pas de problème : établi est trouvé, rétabli ne l'est pas.
Mais &.#233;tabli n'est pas trouvé alors que r&.#233;tabli, oui, comme si il n'y avait pas de limite de mot \b.
Même constat avec un caractère accentué à la fin : clé, clés et cl&.#233;, cl&.#233;s
la regex : \b(clé|cl&.#233;)\b
clé est trouvé et pas clés donc c'est parfait.
Mais cl&.#233; n'est pas trouvé (il le devrait pourtant) et cl&.#233;s est trouvé montrant que la limite de mot avant ne fonctionne pas.
Bien sûr, si je fais \bcl&.#233;\b, le problème est le même.
ce que je cherche à faire n'est peut-être pas possible ?
pourtant la solution preg_replace et regex fonctionne très bien pour trouver le mot et le remplacer en évitant qu'il fasse partie d'une url, de balises html ou d'un lien et ce, même s'il est accentué (enfin, j'ai dû placer en début descript ceci :setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1'); ).
Il y a tellement de docs sur le sujet que je suis sûrement passé à coté de l'explication et peut-être de la solution. Besoin d'un peu d'aide, donc ;o)
merci,
cordialement,
Ludo ;)
Partager