我目前正尝试使用PHP从包含HTML标记的文本中获取所有单词
我的regex有一个问题,如果一个单词以重音结束("_"例如),我的单词就不会被捕获。
我的正则表达式是
$re = '/([^
\t\f>< /]+(?!>))\b/';
$str = 'Non ! Non ! Je ne veux pas d\'un éléphant dans un boa.
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.
-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示例
为什么这个正则表达式与重音不匹配?
请发布一个代码示例,以便我们更好地提供帮助,但您可能正在寻找mb-ereg-u匹配-默认情况下,php的字符串函数只能操作ASCII字符。
打开你的"活例子",匹配8是éléphant,其中包括你的重音字符。
抱歉,我更新了我的帖子。单词"elev&233;"不匹配。谢谢你的帮助
@用户3257966 YW!如果答案有助于解决您的问题,请参阅此处(:
如果要使用regex,可以使用:
]+>(*SKIP)(*FAIL)|([A-zà-?]+)
工作演示
请注意,regex character类中的字符范围使用ASCII范围,我用最简单的方法,但请记住,该范围包含您可能不需要的符号。如果要支持特定字符,请检查ASCII表并使用所需的范围
另外,如果要将c'est捕获为单个单词,则只需在character类中添加单引号,如下所示:
]+>(*SKIP)(*FAIL)|([A-zà-?']+)
编辑:如果您检查Bobble气泡注释,您将发现Unicode标志的一个非常有用的用法。引用他的评论,您可以使用一个非常简单的regex,方法是使用这样的EDOCX1(unicode)标志:
]+>(*SKIP)(*FAIL)|([\w']+)
工作演示
如果您希望由-分隔的单词(如Dessine-moi)匹配为单个单词而不是2,只需将连字符添加到carecter类中,如下所示:
]+>(*SKIP)(*FAIL)|([\w'-]+)
编辑2:由于您第二次编辑了您的问题,并且还评论说您不希望使用初始连字符,因此您可以使用此regex:
]+>(*SKIP)(*FAIL)|([\w']+(?:[\w'-]*))
工作演示
或者用[\w\'-]代替[A-zÀ-ÿ']和u (PCRE_UTF8)标志(也不需要捕获组)。还可以了解为什么A-z会导致意外的匹配。
谢谢费德里克!只是一点小意思,"c'est"在2个部分是匹配的,但必须只有一个词。有可能吗?(juste 1匹配if')thx
@BobbleBubble,对了,这就是为什么我把关于ASCII范围的注释放在这里的原因,这个想法是为了显示范围特性,我让OP来实现他想要使用的任何范围。
@用户3257966我已经回答了这个问题,并以c'est为例。阅读答案,最后你会发现第二个regex与c'est匹配为一个单词。
@BobbleBubble非常有用,他不知道\w在Unicode模式下也匹配重音字符。我在答案中添加了这个信息。谢谢你的评论
THX@Frederico,你救了我一天:)
@BobbleBubble THX也是!
最后一件事我的朋友……如果这个符号开始我的话,我怎么也抓不到这个符号呢?像这样:-莱西莫迪尔穆顿…(我编辑了我的帖子)
@用户3257966我已经为您的评论添加了第二个编辑
@费德里科广场非常感谢!
@弗雷德里科。对不起,我对瑞格斯很不好,但在这里,"圣人有手,朝圣者的手会碰到,"朝圣者被他的"抓住"这个词,有什么解决办法吗?:)
@用户3257966,你可以试试这个]+>(*SKIP)(*FAIL)|(\w+(?:[\w'-]*\w+))。工作演示
@费德里科广场!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!