负Lookbehind正则表达式在PHP中不起作用

负Lookbehind正则表达式在PHP中不起作用,php,regex,Php,Regex,我用PHP编写了一段代码,用于匹配副词(以“ly”结尾的单词),副词应该不匹配任何每日、每周、每月、双日、双周等单词 例如,给定句子本地每天会面3天,只有本地应该匹配 我使用负查找锁定了正则表达式语法,但PHP向我抛出了一个错误: 编译失败:Lookback断言在偏移量处不是固定长度 以下是我在PHP中的完整代码: <?php $sentence = "Locally meet daily for next 3 days"; // Use preg_match() function to

我用PHP编写了一段代码,用于匹配副词(以“ly”结尾的单词),副词应该匹配任何每日、每周、每月、双日、双周等单词

例如,给定句子
本地每天会面3天
,只有
本地
应该匹配

我使用负查找锁定了正则表达式语法,但PHP向我抛出了一个错误:

编译失败:Lookback断言在偏移量处不是固定长度

以下是我在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); 

您可以使用负前瞻,但它必须在您的比赛组之前。您还需要在正则表达式的开头添加断言(<代码> \b/COD>),以使(例如)正则表达式在<代码>每日< /代码>中不符合<代码> AyIL<代码>,而另一个则在中间不匹配单词“<代码> Ly <代码> >例如<代码>新婚< <代码>:

$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
                )
        )
)

我怎样才能排除像bidaily、biweekly这样的词呢?要么把这些词放在替换词中,要么在它前面加上
(?:bi)
,即
\b(?(?:bi)(?:daily | weekly | monthly))(\w+ly)
谢谢你,尼克。我用:
preg_match_all('/\b(?(?:\w*(每日、每周、每月))(\w+ly)/',$句子,$matches,preg_OFFSET_CAPTURE)解决了这个问题@solutionhacker这可能更简单。注意,我刚想到在正则表达式的末尾需要一个单词中断,这样你就不能在中间使用与 Ly匹配的单词。请参阅我的编辑。