我怎样才能合并两个(或更多)preg_replace - PHP

How can I combine two (or more) preg_replace's - PHP

<编辑>

非常感谢所有提供答案的人,你们都给了我很好的选择。在选择答案之前,我会尝试每一种,看看哪一种适合我的确切需求。不过,我非常感谢您的所有回复,每个人对事物的处理方式都不一样。 =)

bbcodes 可以(但并非总是如此)包含选项,例如:

[URL="http://google.com"]GOOGLE[/URL]

我目前使用以下方法从我的字符串中隐藏多个变量:

$result = preg_replace('/\[img\](.*)\[\/img\]/im', 'REPLACED', $qry);
$result = preg_replace('/\[url.*\](.*)\[\/url\]/im', 'REPLACED', $qry);

这行得通,但我希望只用一个 preg 替换就可以做到这一点,并且如果需要的话,将来可以很容易地添加到它。

我尝试使用:

$result = preg_replace("#\[/?(img|url)(=\s*\"?.*?\"?\s*)?]#im", 'REPLACED', $qry);

这只是隐藏标签本身。

如何组合这些替换?

preg_replace 函数可以接受参数数组。作为一种选择,您可以尝试使用:

$find = ['/\[img\](.*)\[\/img\]/im', '/\[url.*\](.*)\[\/url\]/im'];
$replace = ['REPLACED', 'REPLACED'];

$result = preg_replace($find, $replace, $qry);

我认为这样您可以灵活地使用不同的 replaced

您的尝试非常接近,但您需要使用对第一个捕获组的反向引用来结束匹配。

$result = preg_replace('~\[(img|url)\](.*)\[/\]~i', 'REPLACED', $qry);

演示:https://3v4l.org/Ybvh2

如果没有 ^$m 修饰符也没有任何功能。也许您需要 s 修饰符以便 . 扩展到换行符? https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

我也会将 * 量词更改为非贪婪的:

$result = preg_replace('~\[(img|url)\](.*?)\[/\]~is', 'REPLACED', $qry);

考虑https://3v4l.org/8SdNd vs. https://3v4l.org/MC0pf(不贪心)。

如果您需要区分图像和 URL,使用 2 个正则表达式可能最简单。尽管可以使用 preg_replace_callback:

实现 1 个正则表达式的功能
$result = preg_replace_callback('~\[(img|url)\](.*?)\[/\]~is', function($match){
        return $match[1] =='url' ? 'REPLACED url' : 'REPLACED img';
        }, '[img]test[/img][not]img[/not][url]http][/url]');
echo $result;

你可以使用

preg_replace('~\[(img|url)\b[^]]*](.*?)\[/]~is', 'REPLACED', $qry);

正则表达式匹配:

  • \[ - 一个 [ 字符
  • (img|url) - 第 1 组:imgurl
  • \b - 单词边界
  • [^]]* - ]
  • 以外的 0 个或更多字符
  • ] - 一个 ] 字符
  • (.*?) - 第 2 组:任意零个或多个字符,尽可能少
  • \[/] - [/,内容同第一组,还有一个].

参见 PHP demo:

$qry = '[url="google.com"]google[/url] and [img]image here[/img]';
echo preg_replace('~\[(img|url)\b[^]]*](.*?)\[/]~is', 'REPLACED', $qry);
// => REPLACED and REPLACED