【问题标题】:Preg_replace do not replace everythingPreg_replace 不替换所有内容
【发布时间】:2014-07-31 13:29:28
【问题描述】:
$content = $this->comment->getContent(true);
$bbcodes = array (
  '#\[cytat=(.*?)\](.*?)\[/cytat\]#' => '<div class="cytata">\\1 napisał/a </div> <div class="cytatb">\\2</div>',
  '#\[cytat\](.*?)\[/cytat\]#' => '<div class="cytata">cytat</div><div class="cytatb">\\1</div>',
);

$content = preg_replace(array_keys($bbcodes), array_values($bbcodes), $content);

preg_replace 并没有像那样替换每个标签。 例如,如果只有一个标签[cytat]some text[/cytat](cytat 表示波兰语中的引号),那么一切都会好起来的,输出将是

<div class="cytata">author napisał/a </div> <div class="cytatb">some text</div>                 

但是会有不止一个引号,那么 preg 只替换一个标签,例如

<div class="cytata">o0skar napisał/a </div> <div class="cytatb">[cytat=o0skar]test nr2</div>[/cytat]

这就是双引号等的输出。有什么想法吗?有什么问题吗?

也许我可以将 preg_replace 放在 while 循环中,但我不知道 preg_replace 是否返回任何变量。

【问题讨论】:

  • 哦,我忘了,当然 preg_replace 是返回值.. 对不起我的错误
  • 您能发布您遇到问题的实际内容吗?
  • [cytat=o0skar][cytat=o0skar]test nr2[/cytat][/cytat]
  • 是的...正则表达式不能很好地处理嵌套内容。您的第一个替换将从第一个 [cytat] 匹配到第一个 [/cytat],这将破坏第二个。如果要处理嵌套表达式,则需要递归替换函数。
  • 有一个 PHP 扩展可以处理 BBCodes - php.net/manual/en/book.bbcode.php

标签: php preg-replace


【解决方案1】:

为了正则表达式的精彩,让我们看看这个。我不得不将模式更改 1 个字符。我删除了其中一个懒惰的? 并将其设为 preg_replace_callback

function pregcallbackfunc($matches){
    $pattern = '#\[cytat=(.*?)\](.*)\[/cytat\]#';
    if(preg_match($pattern, $matches[2])){
        $matches[2] = preg_replace_callback($pattern,'pregcallbackfunc', $matches[2]);
    }
    if($matches[2]){
        return '<div class="cytata">'.$matches[1].' napisał/a </div> <div class="cytatb">'.$matches[2].'</div>';
    }
    return '<div class="cytata">cytat</div><div class="cytatb">'.$matches[1].'</div>';
}

$content = '[cytat=o0skar][cytat=o0skar]test nr2[/cytat][/cytat]';
$content = preg_replace_callback('#\[cytat=(.*?)\](.*)\[/cytat\]#', 'pregcallbackfunc', $content);

进行这种递归将保证任何级别的嵌套引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多