【问题标题】:Why does preg_match not find some literal words为什么 preg_match 找不到一些文字
【发布时间】:2016-08-08 06:33:05
【问题描述】:

使用 PHP,我正在尝试测试字符串中是否存在各种单词和模式,但无法弄清楚为什么我在尝试匹配某些单词时会看到奇怪的行为。

示例 1: 为什么以下不返回 1?

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)';

$result = preg_match('/(string)/i', $test, $matches);

$result 对于上述内容始终为零,即使主题字符串中存在单词“String”。

示例 2: 但是,假设我将正则表达式稍微更改为以下内容:

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)';
$result = preg_match('/st.+(ring)/i', $test, $matches);

上面的结果为 $result 返回值 1。好像当我把“字符串”这个词分成不同的部分时,我可以得到一个匹配。

示例 3: 再次,当我稍微修改此示例中的正则表达式时,它也返回零,但我不知道为什么:

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)';
$result = preg_match('/(tring)/i', $test, $matches);

尝试匹配“tring”等字符序列返回 0,但匹配“ring”时返回 1。但“tring”听起来不像任何类型的特殊字或保留字!

对于“document”和“unes​​cape”等各种其他词,这种行为也是相同的,我相信还有很多其他词。

我假设一些单词可能被正则表达式引擎区别对待,因为它们可能在某些方面被保留或特殊,但我无法找到上述行为的官方解释。

如果我遗漏了一些非常明显的东西,我深表歉意,如果有人可以向我解释这一点,我将不胜感激。 非常感谢。

【问题讨论】:

    标签: php regex string preg-match reserved


    【解决方案1】:

    我认为您的第一个正则表达式很好。看这里 https://regex101.com/r/tO9vN8/1

    但是字符集似乎有问题,我不得不重写表达式 - 如果我从这个站点复制,正则表达式不匹配。

    我希望这是正确的方向......

    【讨论】:

    • 你是对的。当我将主题字符串粘贴到记事本++中时,我可以看到以前看不到的各种隐藏字符。 “字符串”一词出现为“字符串”。因此 regex 和 preg_match 工作得很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多