2016-11-16 9 views
1

Я сейчас пытаюсь с PHP, чтобы получить все слова из текста, содержащие HTML-тегиПолучить все слова из текста, содержащие HTML тегов с PHP регулярных выражений

Моя регулярное выражение имеет проблемы, если слово закончено с акцентом (" é ", например), мое слово не поймано.

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

$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); 

но, в моем примере, слово «Eleve» в не соответствует

Вы можете найти пример здесь: regex live example

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

+0

Пожалуйста, пост код примера, чтобы мы могли лучше, но вы _probably_ ищете [mb_ereg_match] (https://secure.php.net/manual/en/function.mb-ereg-match.php) - по умолчанию строковые функции PHP работают только с символами ASCII. – 9999years

+0

Открытие вашего «живого примера», совпадение 8 - 'éléphant', в которое входят ваши персонажи с акцентом. –

+0

Извините, я обновляю свой пост. слово «elevé» не соответствует. thx для вашей помощи – user3257966

ответ

2

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

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

Working demo

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

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

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

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

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

Working demo

Если вы хотите слов, разделенных - как Dessine-moi быть согласованы как единый слово вместо 2, просто добавьте дефис к классу carácter так:

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

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

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

Working demo

+1

Или '[\ w \ ' -] 'вместо' [A-zÀ-ÿ '] 'вместе с' u (PCRE_UTF8) '[flag] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) (также нет необходимости в захвате группы). Также см. [почему «Az' может привести к неожиданным совпадениям] (http://stackoverflow.com/a/28449959/5527985). –

+0

thx federico! всего лишь мелочи,« c » est "является совпадением на 2 части, но это должно быть только одно слово. Возможно ли это (juste 1 match if ') thx – user3257966

+0

@bobblebubble, правильно, поэтому я поставил примечание о диапазоне ASCII, идея заключалась в том, чтобы показать диапазон я оставляю OP для реализации того диапазона, который он хочет использовать. –