使用 php 正则表达式从包含 html 标签的文本中获取所有单词

Get all words from text containing html tags with 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é”不匹配

请在此处查找示例: regex live example

为什么这个正则表达式不匹配带重音符号的最后一个字符?

如果你想使用正则表达式,你可以使用:

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

Working demo

请注意,正则表达式字符 class 中的字符范围使用 ASCII 范围,我采用最简单的方式,但请记住,该范围包含您可能不需要的符号。如果您想支持特定字符,请检查 ascii table 并使用您想要的范围

此外,如果您想将 c'est 捕获为单个单词,则只需在字符 class 中添加单引号,如下所示:

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

编辑: 如果您查看 bobble bubble 评论,您会发现 unicode 标志的一个非常有用的用法。引用他的评论,您可以通过利用 u (unicode) 标志来使用非常简单的正则表达式,如下所示:

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

Working demo

如果您希望像 Dessine-moi 这样由 - 分隔的单词作为单个单词而不是 2 个单词进行匹配,只需将连字符添加到字符 class 中,如下所示:

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

编辑 2: 由于您第二次编辑了问题并且还评论说您不需要初始连字符,那么您可以使用此正则表达式:

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

Working demo