preg_replace和str_replace似乎无法一起使用

时间:2017-03-17 17:49:15

标签: php preg-replace str-replace

我正在尝试使用[secret]标签创建BB代码。 BB代码根据用户级别“编辑”文本。但是,我遇到了让它正常工作的问题。

我目前的代码是:

    $replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
    $text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', str_replace($replace, "█", $text));

输出用户控制杆:

█████[██████]███████████.[/██████]█████

大多数情况都是正确的,然而,它变成了BB标签以及其他一些不被认为是编辑的东西。

我已经移动了preg_replace和str_replace的顺序,但无法让它正常工作。

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说的那样,在将标签传递给正则表达式匹配之前,您也要用块替换标记。这样的事情应该可以解决问题。 preg_replace_callback()preg_replace()几乎相同,但您可以使用函数来说明您要用字符串替换字符串。

<?php
$string = "Here is a secret: [secret]foo bar baz[/secret]";
$result = preg_replace_callback("/\[secret\](.*?)\[\/secret\]/si", function($matches) {
    return preg_replace("/[\w ]/i", "&#9608;", $matches[1]);
}, $string);
echo $result;

如果您将原始代码分解为多个步骤,则可以看到问题:

<?php
$replace = array(" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");
$redacted = str_replace($replace, "&#9608;", $text);
// Clearly, the string "secret" is gone by now, so the regex will never match
$text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', $redacted);
相关问题