0
<?php
$data='123
[test=abc]cba[/test]
321';
$test = preg_replace("(\[test=(.+?)\](.+?)\[\/test\])is","$1",$data);
echo $test;
?>

我希望上面的代码返回 abc ,但不是返回abc它返回 123 abc 321 请告诉我我做错了什么。

4

3 回答 3

1

您只是替换匹配的部分(BBcode 部分)。您将保留字符串的其余部分不变。

如果您还想删除前导/尾随文本,请将其包含在表达式中:

$test = preg_replace("(.*\[test=(.+?)\](.+?)\[\/test\].*)is","$1",$data);
于 2013-05-01T21:42:02.110 回答
1

我不知道您是否知道这一点,但是您的正则表达式中最外面的一组括号不会形成一个组(捕获或其他)。PHP 将它们解释为正则表达式分隔符。如果您知道这一点,并且故意将它们用作分隔符,请不要这样做。~通常最好使用在正则表达式( , %,@等)中从不具有任何特殊含义的非括号字符。

我同意Casimir的观点,这preg_match()是您应该使用的工具,而不是preg_replace(). 但他的解决方案比它需要的更棘手。你原来的正则表达式工作正常;您所要做的就是获取第一个捕获组的内容,如下所示:

if (preg_match('%\[test=(.+?)\](.+?)\[/test\]%si', $data, $match)) {
    $test = $match[1];
}
于 2013-05-02T00:42:44.000 回答
0

您不需要在这里使用替换,您所需要的只是在字符串中取一些东西。要做到这一点 preg_match 更有用:

$data='123
[test=abc]cba[/test]
321';
$test = preg_match('~\[test=\K[^\]]++~', $data, $match);
echo $match[0];
于 2013-05-01T22:59:15.887 回答