php 正则表达式匹配不以某些字符开始的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 正则表达式匹配不以某些字符开始的字符串相关的知识,希望对你有一定的参考价值。

例如有如下字符串
$str='<li><span>1233455<span><li><li>fffffddf</li><li>fffffddf<span>122323</span></li><li>fffffdd<span>3455fsf</span>fwrw</li>';
我想要的结果是匹配出数组
array('0'=>'fffffddf<span>122323</span>','1'=>'fffffdd<span>3455fsf</span>fwrw');
即如果<li></li>之间字符时以<span>开头的话,那么就剔除这一项

照你的匹配结果,那<li></li>中没有<span></span>的也会被去除啊,因为<li>fffffddf</li>没在结果中
所以按你需要的结果
$reg = '#<li>([a-z]+<span>[\w]*</span>[\w]*)</li>#i';
如果只是<li></li>之间字符时以<span>开头的话,那么就剔除这一项
$reg = '#<li>([a-z]+(?:<span>[\w]*</span>)?[\w]*)</li>#i';
参考技术A <li>(?!<span>).*</span></li>

其中 (?!<span>) 代表不以 <span>开头

正则表达式:如何匹配不以前缀列表开头的子字符串

【中文标题】正则表达式:如何匹配不以前缀列表开头的子字符串【英文标题】:Regex: How to match substrings not starting with a list of prefixes 【发布时间】:2019-09-27 15:39:30 【问题描述】:

我需要替换字符串中匹配的单词,但不包括这些单词的前缀列表。

The matchingWord should be replaced in the first line
But excludePrefix1.matchingWord , not in this line
Neither in this other line excludePrefix2.matchingWord
But again in this allowedPrefix.matchingWord

我成功地使用了一个带有单个前缀的正则表达式:

(?<!(excludePrefix1\.))matchingWord

但是如何使用几个排除的前缀来做到这一点?

我尝试过类似的东西:

(?<!((excludePrefix1\.)(excludePrefix2\.)))matchingWord

但这不起作用,请一位正则表达式专家帮助我们解决这个棘手的问题?

【问题讨论】:

【参考方案1】:

在几个工具中,负后视必须是固定长度,对于您的问题,请使用多个后视:

(?<!excludePrefix1\.)(?<!excludePrefix2\.)matchingWord

【讨论】:

以上是关于php 正则表达式匹配不以某些字符开始的字符串的主要内容,如果未能解决你的问题,请参考以下文章

字符串的正则表达式不以给定的后缀结尾

正则表达式:如何匹配不以前缀列表开头的子字符串

正则表达式 - 以特定字符串开头但不以另一个子字符串结尾

正则表达式 选中以某些字符开始,某些字符结尾的字符串

正则表达式

正则表达式匹配空间不以 char 开头/结尾