我怎样才能合并两个(或更多)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);
如果没有 ^
或 $
,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 组:img
或 url
\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
<编辑>
非常感谢所有提供答案的人,你们都给了我很好的选择。在选择答案之前,我会尝试每一种,看看哪一种适合我的确切需求。不过,我非常感谢您的所有回复,每个人对事物的处理方式都不一样。 =)
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);
如果没有 ^
或 $
,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
:
$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 组:img
或url
\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