函数中的PHP RegEx变量

时间:2011-08-23 01:29:10

标签: php regex

我正在使用一个函数来解析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表示它是正在使用的用户名,为此可以忽略。

非常感谢任何帮助。

4 个答案:

答案 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来保证安全。