我正在使用一个函数来解析UBBC,我想使用一个函数从数据库中查找数据来替换文本(一种[用户]类型的函数)。但是代码忽略了RegExp变量。有什么方法可以让它识别RegExp变量吗?
PHP功能:
function parse_ubbc($string){
$string = $string;
$tags = array(
"user" => "#\[user\](.*?)\[/user\]#is"
);
$html = array(
"user" => user_to_display("$1", 0)
);
return preg_replace($tags, $html, $string);
}
我的函数使用用户的用户名来获取它们的显示名称,0表示它是正在使用的用户名,为此可以忽略。
非常感谢任何帮助。
答案 0 :(得分:0)
如果要从数据库中获取替换,则需要使用preg_replace_callback
。
答案 1 :(得分:0)
function parse_ubbc($string){
$string = $string;
function get_user_to_display($m){
user_to_display($m[1], 0);
}
return preg_replace_callback('#\[user\](.*?)\[/user\]#is', 'get_user_to_display', $string);
}
答案 2 :(得分:0)
您使用字符串'$ 1'调用user_to_display()
,而不是实际找到的字符串。尝试:
function parse_ubbc($string){
$string = $string;
$tags = array(
"user" => "#\[user\](.*?)\[/user\]#ise"
);
$html = array(
"user" => 'user_to_display("$1", 0)'
);
return preg_replace($tags, $html, $string);
}
更改是在regexp字符串的末尾添加“e”,并将函数调用放在引号中。
答案 3 :(得分:0)
根据建议,您要么重写代码以使用preg_replace_callback
。
或者您重写正则表达式以使用#e
标志:
function parse_ubbc($string){
$string = $string;
$tags = array(
"user" => "#\[user\](.*?)\[/user\]#ise"
);
$html = array(
"user" => 'user_to_display("$1", 0)'
);
return preg_replace($tags, $html, $string);
}
为此,PHP不会立即执行替换数组中的函数。这就是为什么你必须将函数调用放入'user_to_display("$1", 0)'
单引号。因此preg_replace稍后会使用#e
标志执行它。
这里的一个重要问题是,用户名可能永远不会包含"
双引号,这将允许正则表达式占位符$0
分解已评估的函数调用(导致破坏)。因此,为什么必须重写正则表达式本身才能使用\w+
而不是.*?
。或者再次使用preg_replace_callback
来保证安全。