preg_match将特殊字符视为单独的单词 [英] preg_match considers special characters as a separate word
本文介绍了preg_match将特殊字符视为单独的单词的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个正则表达式,用于以包含关键字的方式剪切字符串(关键字基于模式,如{query:abcd:1234}),关键字前5个字,关键字后5个字。然后,在该关键字前后,我将显示三个点,如:
Lorem ipsum dolor sit amet, consectetur {query:ABCD:1234} adipiscing elit. Mauris consequat, quam id feugiat varius.
我期望:
... ipsum dolor sit amet, consectetur {query:ABCD:1234} adipiscing elit. Mauris consequat, quam ...
下面是regex:
preg_match("/((?:w+W+){5})" . preg_quote($keyword, "/") . "((?:W+w+){5})/", $text, $matches);
问题是当最后一个单词附加在点/问号/感叹号后时,此正则表达式不起作用,如:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat, quam id feugiat varius {query:ABCD:1234}.
我期望
... quam id feugiat varius {query:ABCD:1234}.
但返回:
... quam id feugiat varius {query:ABCD:1234}
(末尾没有点)。
最后一个词不是关键字时也是一样:
Original: {query:ABCD:1234} Lorem ipsum dolor sit amet!
Returns: {query:ABCD:1234} Lorem ipsum dolor sit amet ...
Expected: {query:ABCD:1234} Lorem ipsum dolor sit amet!
如何修复此问题?
更新:
以下是我的代码:
function cutMessage($text, $search)
{
$pieces = explode(' ', $text);
$firstWord = $pieces[0];
$lastWord = array_pop($pieces);
preg_match("/((?:w+W+){0,5})" . preg_quote($search, "/") . "((?:W+w+){0,5})/", $text, $matches);
$returnText = '';
$pieces = explode(' ', $matches[1]);
if (!empty($matches[1]) && $pieces[0] != $firstWord) {
$returnText .= '... ' . $matches[1];
} elseif (!empty($matches[1])) {
$returnText .= $matches[1];
}
$returnText .= $search;
$pieces = explode(' ', $matches[2]);
if (!empty($matches[2]) && array_pop($pieces) != $lastWord) {
$returnText .= $matches[2] . ' ...';
} elseif (!empty($matches[2])) {
$returnText .= $matches[2];
}
return $returnText;
}
推荐答案
如果使用示例关键字回显当前模式,则(?:W+w+){0,5}
末尾的此部分与逗号或感叹号不匹配,因为w+
与一个或多个单词字符匹配。
((?:w+W+){0,5}){query:ABCD:1234}((?:W+w+){0,5})
^^
一种选择是将允许在第三个捕获组中匹配的任何非单词字符匹配0+倍([!.]?)
((?:w+W+){0,5}){query:ABCD:1234}((?:W+w+){0,5})([!.]?)
^^^^^^^
当您检查捕获的组的值是否不为空时,您可以为第三个捕获组添加另一个检查。
如果该组不为空,则将组2和组3串联。
if (!empty($matches[3])) {
$returnText .= $matches[2] . $matches[3];
} elseif (!empty($matches[2]) && array_pop($pieces) != $lastWord) {
$returnText .= $matches[2] . ' ...';
} elseif (!empty($matches[2])) {
$returnText .= $matches[2];
}
return $returnText;
这篇关于preg_match将特殊字符视为单独的单词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文