使用php regex从包含html标签的文本中获取所有单词

Get all words from text containing html tags with php regex

我目前正尝试使用PHP从包含HTML标记的文本中获取所有单词

我的regex有一个问题,如果一个单词以重音结束("_"例如),我的单词就不会被捕获。

我的正则表达式是

1
2
3
4
5
6
7
8
9
$re = '/([^

\t\f>< /]+(?!>))\b/'
;
$str = 'Non ! Non ! Je ne veux pas d\'un éléphant dans un boa.
<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

1
2
3
4
preg_match_all($re, $str, $matches);

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

但是,在我的例子中,单词"_l_v_"不匹配

请在此处找到一个示例:Regex Live示例

为什么这个正则表达式与重音不匹配?


如果要使用regex,可以使用:

1
<[^>]+>(*SKIP)(*FAIL)|([A--?]+)

工作演示

请注意,regex character类中的字符范围使用ASCII范围,我用最简单的方法,但请记住,该范围包含您可能不需要的符号。如果要支持特定字符,请检查ASCII表并使用所需的范围

另外,如果要将c'est捕获为单个单词,则只需在character类中添加单引号,如下所示:

1
<[^>]+>(*SKIP)(*FAIL)|([A--?']+)

编辑:如果您检查Bobble气泡注释,您将发现Unicode标志的一个非常有用的用法。引用他的评论,您可以使用一个非常简单的regex,方法是使用这样的EDOCX1(unicode)标志:

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

工作演示

如果您希望由-分隔的单词(如Dessine-moi)匹配为单个单词而不是2,只需将连字符添加到carecter类中,如下所示:

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

编辑2:由于您第二次编辑了您的问题,并且还评论说您不希望使用初始连字符,因此您可以使用此regex:

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

工作演示