正则表达式包括除特定单词之外的所有字符

gomnis 发布于 2019-03-09 php 最后更新 2019-03-09 14:40 3 浏览

我想用正则表达式过滤掉某个特定的模式。 给定的字符串:[视频网址:http:\ ddf.sd.com asd:fgfggh]然后一些文本再次出现在这里[视频网址:http:\ ddf.sd.com asd:fgfggh]以及其他一些文字。 所需的O / P:然后一些文本再次出现在这里,接下来还有一些文字。 语言:PHP 我试过的:

$text='[video url:http:\\ddf.sd.com asd:fgfggh] Then some text goes here then again [video url:http:\\ddf.sd.com asd:fgfggh] and some more text following this.';
$op = reg_replace('/\[video(.*)\]/','',$text);
echo $op
我得到的o / p: 以及其他一些文字。
已邀请:

jvitae

赞同来自:

我稍微改变了模式:

$text='[video url:http:\\ddf.sd.com asd:fgfggh] Then some text goes here then again [video url:http:\\ddf.sd.com asd:fgfggh] and some more text following this.';
$op = reg_replace('/\[video.*?\]/','',$text);
echo $op;

znon

赞同来自:

假设网址中没有方括号,您可以使用

'/\[video[^\]]*\]/'
您的原始正则表达式不起作用,因为.*会贪婪地匹配最终]之前的所有字符。

eomnis

赞同来自:

问题是你的模式是贪婪的,.*可以匹配它。您需要将匹配更改为

\[video[^\]]++]
即一个开口支架,后跟任意数量的物品,这些物品不是一个封闭式支架,后面是一个封闭式支架。 所以代码看起来像
$op = reg_replace('/\[video[^\]]++]/','',$text);
这种模式也具有占有性(++),这将极大地减少正则表达式引擎中的回溯并加快速度。