2011-08-23 74 views
1

我正在使用函數來解析UBBC,我想使用函數從數據庫中查找數據以替換文本([用戶]類型的函數)。但是,代碼忽略了RegExp變量。有什麼辦法可以讓它識別RegExp變量嗎?函數中的PHP 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

您要麼重寫您的代碼使用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以確保安全。

+0

這符合我想要的,因爲我爲了節省時間而刪除了很多其他代碼。我只是想知道是否有任何我可以找到更多關於這個? – Samyel

+0

手冊http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php中有關於'PREG_REPLACE_EVAL'修飾符的一些信息。關於替換代碼 - 它只是一個有效的表達式。將函數調用括入單引號通常效果最好。 – mario

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); 
} 
0

您打電話給user_to_display()並輸入字符串'$ 1',而不是實際找到的字符串。請嘗試:

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); 
} 

這些更改將'e'添加到正則表達式字符串的末尾,並將函數調用放在引號中。