Получить все слова из текста, содержащего HTML-теги с помощью PHP Regex

В настоящее время я пытаюсь с помощью PHP получить все слова из текста, содержащего теги HTML

У моего регулярного выражения есть проблема: если слово заканчивается ударением (например, «é»), мое слово не перехватывается.

Мое регулярное выражение

$re = '/([^\r\n\t\f>< /]+(?!>))\b/';
$str = 'Non ! Non ! Je ne veux pas d\'un éléphant dans un boa.<br>
<p> Un boa c\'est très dangereux, et un éléphant élévé c\'est très encombrant. Chez moi c\'est tout petit. J\'ai besoin d\'un mouton. Dessine-moi un mouton.
</p>
-Laisse-moi dire mouton... For saints have hands that pilgrims\' hands do touch

«;

preg_match_all($re, $str, $matches);

// but word elevé is not completely match
print_r($matches);

но, в моем примере, слово «élévé» не соответствует

Пожалуйста, найдите пример здесь:
регулярный пример

Почему это регулярное выражение не соответствует последнему символу с ударением?

1

Решение

Если вы хотите использовать регулярное выражение, вы можете использовать:

<[^>]+>(*SKIP)(*FAIL)|([A-zÀ-ÿ]+)

Рабочая демонстрация

Обратите внимание, что диапазон символов в классе символов regex использует диапазон ASCII, я бы сказал проще, но имейте в виду, что этот диапазон содержит символы, которые вам могут не понадобиться. Если вы хотите поддерживать определенные символы, проверьте таблицу ascii и используйте нужный диапазон

Кроме того, если вы хотите захватить c'est как одно слово, затем просто добавьте одинарную кавычку в класс символов следующим образом:

<[^>]+>(*SKIP)(*FAIL)|([A-zÀ-ÿ']+)

Редактировать: если вы проверите пузырь комментарий, вы найдете очень полезное использование флага Unicode. Цитируя его комментарий, вы можете использовать очень простое регулярное выражение с помощью кредитного плеча. u (Unicode) флаг, как это:

<[^>]+>(*SKIP)(*FAIL)|([\w']+)

Рабочая демонстрация

Если вы хотите, чтобы слова разделялись - лайк Dessine-moi чтобы соответствовать одному слову вместо 2, просто добавьте дефис к классу caracter следующим образом:

<[^>]+>(*SKIP)(*FAIL)|([\w'-]+)

Изменить 2: так как вы редактировали свой вопрос во 2-й раз и также отметили, что вам не нужен начальный дефис, вы можете использовать это регулярное выражение:

<[^>]+>(*SKIP)(*FAIL)|([\w']+(?:[\w'-]*))

Рабочая демонстрация

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]