2011-08-23 7 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을 사용하도록 코드를 다시 작성하십시오. 이 PHP 즉시 교체 배열 함수를 실행하지 않는 것이 중요하다고를 들어

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 플래그를 사용합니다. 그렇기 때문에 함수 호출을 작은 따옴표 'user_to_display("$1", 0)'에 넣어야합니다. 따라서 preg_replace는 나중에 #e 플래그로 실행합니다.

여기에 중요한 점은 사용자 이름에 " 큰 따옴표가 포함되지 않아서 정규식 자리 표시 자 $0이 평가 된 함수 호출을 깨뜨릴 수 있다는 것입니다 (원인이 원인 일 수 있음). 따라서 .*? 대신 \w+을 사용하여 정규식 자체를 다시 작성해야합니다. 또는 안전을 위해 preg_replace_callback을 다시 사용하십시오.

+0

이것은 내가 당신의 시간을 절약하기 위해 제거한 많은 다른 코드를 가지고 있기 때문에 내가 원하는 것입니다. 이 문제에 대해 더 자세히 알 수있는 곳이 있는지 궁금합니다. – Samyel

+0

'PREG_REPLACE_EVAL' 수정 자에 대한 매뉴얼 http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php에 대한 정보가 있습니다. 대체 코드와 관련해서는 유효한 표현식이어야합니다. 함수 호출을 작은 따옴표로 묶는 것이 종종 가장 잘 작동합니다. – 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

당신은 문자열 '$ 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); 
} 

을 변경 사항이 정규 표현식 문자열의 끝에 'E'를 추가하고, 따옴표로 함수 호출을 가하고 있습니다.