1

我用 PHP 编写了一段代码,旨在匹配一个副词(以 'ly' 结尾的单词),该副词应该匹配每天、每周、每月、每天、每两周等的任何单词。

例如,给定句子Locally meet daily for 3 days, only Locallyshould match。

我使用否定的lookbehind确定了正则表达式语法,但PHP给我一个错误:

编译失败:后向断言在偏移处不是固定长度..

这是我在 PHP 中的完整代码:

<?php
$sentence = "Locally meet daily for next 3 days";

// Use preg_match() function to check match 
preg_match('/(\w+ly)(?<!(daily|weekly|monthly))/', $sentence, $matches, PREG_OFFSET_CAPTURE); 

// Display matches result 
print_r($matches); 

我尝试过消极的前瞻,但它并没有给我有希望的结果。有人可以建议可以做什么吗?谢谢

4

1 回答 1

1

您可以使用负前瞻,但它需要在您的匹配组之前。您还需要\b在正则表达式的开头添加一个 word-break ( ) 断言,以便(例如)正则表达式不匹配ailyin daily,并在末尾添加另一个断言,这样您就不会匹配ly中间的单词,例如newlywed

$sentence = "Locally meet daily newlywed for next 3 days";

preg_match_all('/\b(?!(?:daily|weekly|monthly))(\w+ly)\b/', $sentence, $matches, PREG_OFFSET_CAPTURE); 

print_r($matches); 

输出:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Locally
                    [1] => 0
                )
        )
    [1] => Array
        (
            [0] => Array
                (
                    [0] => Locally
                    [1] => 0
                )
        )
)

3v4l.org 上的演示

于 2020-05-08T04:30:18.593 回答