В настоящее время я пытаюсь с помощью 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é» не соответствует
Пожалуйста, найдите пример здесь:
регулярный пример
Почему это регулярное выражение не соответствует последнему символу с ударением?
Если вы хотите использовать регулярное выражение, вы можете использовать:
<[^>]+>(*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'-]*))
Других решений пока нет …