<?php
$data='123
[test=abc]cba[/test]
321';
$test = preg_replace("(\[test=(.+?)\](.+?)\[\/test\])is","$1",$data);
echo $test;
?>
我希望上面的代码返回
abc
,但不是返回abc
它返回
123 abc 321
请告诉我我做错了什么。
<?php
$data='123
[test=abc]cba[/test]
321';
$test = preg_replace("(\[test=(.+?)\](.+?)\[\/test\])is","$1",$data);
echo $test;
?>
我希望上面的代码返回
abc
,但不是返回abc
它返回
123 abc 321
请告诉我我做错了什么。
您只是替换匹配的部分(BBcode 部分)。您将保留字符串的其余部分不变。
如果您还想删除前导/尾随文本,请将其包含在表达式中:
$test = preg_replace("(.*\[test=(.+?)\](.+?)\[\/test\].*)is","$1",$data);
我不知道您是否知道这一点,但是您的正则表达式中最外面的一组括号不会形成一个组(捕获或其他)。PHP 将它们解释为正则表达式分隔符。如果您知道这一点,并且故意将它们用作分隔符,请不要这样做。~
通常最好使用在正则表达式( , %
,@
等)中从不具有任何特殊含义的非括号字符。
我同意Casimir的观点,这preg_match()
是您应该使用的工具,而不是preg_replace()
. 但他的解决方案比它需要的更棘手。你原来的正则表达式工作正常;您所要做的就是获取第一个捕获组的内容,如下所示:
if (preg_match('%\[test=(.+?)\](.+?)\[/test\]%si', $data, $match)) {
$test = $match[1];
}
您不需要在这里使用替换,您所需要的只是在字符串中取一些东西。要做到这一点 preg_match 更有用:
$data='123
[test=abc]cba[/test]
321';
$test = preg_match('~\[test=\K[^\]]++~', $data, $match);
echo $match[0];