preg_match将特殊字符视为单独的单词 [英] preg_match considers special characters as a separate word

查看:29
本文介绍了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;

Regex demo|Php demo

这篇关于preg_match将特殊字符视为单独的单词的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆