我正在尝试使用[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的顺序,但无法让它正常工作。
答案 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", "█", $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, "█", $text);
// Clearly, the string "secret" is gone by now, so the regex will never match
$text = preg_replace('#\[secret\](.*?)\[/secret\]#si', '\1', $redacted);