php - 在列表中,没有变长的长度追踪,一段时间内的php 正规表达式 不会在一个单词后面?

  显示原文与译文双语对照的内容

我正在尝试写一个匹配时间的正规表达式,而不是立即从列表中删除一个单词的时间。

我相信我需要一个先行或者追溯断言来完成这个任务,我已经尝试过:

/(?(mr|ms|mrs))./u/(?(mr|ms|mrs).)./u!

这两个词都匹配所有,所以它不排除单词后面的句点。

我还尝试过追溯,我认为这就是我需要的:

/(?<!(mr|ms|mrs))./u

但是,它看起来必须是固定长度,因为它不会编译: preg_replace(): Compilation failed: lookbehind assertion is not fixed length at offset 15

下面是一些测试用例,当使用preg替换来删除匹配时,会出现预期的结果:


'Mr. Tom A. Suggins'//Mr. Tom A Suggins


'Mrs.. Jane P Suggins, jr.'//Mrs. Jane P Suggins, jr


'.Ms... Jane P. Suggins'//Ms. Jane P Suggins



是否有任何方法在PHP中不需要可变长度的回溯支持?

时间: 原作者:

你可以在 PCRE 正规表达式 中使用 (*SKIP)(*F) 动词来失败/跳过某些选定


$repl = preg_replace('/(?:Mrs?|Ms).(*SKIP)(*F)|./', '', $str);



正规表达式 演示插件

原作者:

使用这里 正规表达式 来匹配这些句点:

 
(?:mrs|m[rs]).K|.



 

然后用什么替换它们:


preg_repalce('~(?:mrs|m[rs]).K|.~i', '', $content);



现场演示插件

原作者:

/(?<!mr|ms|mrs)./u



只需稍加修改即可修复:


/(?<!m[rs])(?<!mrs)./u



演示工具

原作者:
...