2009-06-08 6 views
1

저는 자동으로 HTML 주석을 처리하는 Joomla 용 플러그인을 작성했습니다. {dropcap} B {/ dropcap}을 입력하고 드롭 뚜껑 스타일을 만듭니다.PHP 정규 표현식의 파이프 관련 문제

매개 변수를 플러그인에 전달하는 방법이 필요 했으므로 {dropcap} B | FF00FF | 00FF00 {/ dropcap}이 가장 좋습니다. 내가 사용하는 경우

if (preg_match_all('/{dropcap}(.+?){\/dropcap}/', $row->text, $matches, PREG_PATTERN_ORDER) > 0) 
{ 
    foreach ($matches[0] as $match) 
    { 
    $SimpleDropCapPlugin->html = ""; 
    $_temp = preg_replace("/{.+?}/", "", $match); 
    $_params = explode('|', $_temp); 
    $SimpleDropCapPlugin->text_dropcap = $_params[0]; 
    if ($_params[1]) 
     $SimpleDropCapPlugin->colour_border = '#' . $_params[1]; 
    if ($_params[2]) 
     $SimpleDropCapPlugin->colour_background = '#' . $_params[2]; 
    if ($_params[3]) 
     $SimpleDropCapPlugin->colour_text = '#' . $_params[3]; 
    if ($_params[4]) 
     $SimpleDropCapPlugin->font_size = $_params[4]; 
    if ($_params[5]) 
     $SimpleDropCapPlugin->font_family = $_params[5]; 

    $SimpleDropCapPlugin->html .= "<span style=\"border: 1px solid " . $SimpleDropCapPlugin->colour_border . "; background: " . $SimpleDropCapPlugin->colour_background . " none repeat scroll 0% 0%; margin-right: 6px; margin-top: 5px; float: left; color: " . $SimpleDropCapPlugin->colour_text . "; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-size: " . $SimpleDropCapPlugin->font_size . "px; line-height: 60px; padding-top: 2px; padding-right: 5px; font-family: " . $SimpleDropCapPlugin->font_family . ";\">"; 
    $SimpleDropCapPlugin->html .= strtoupper($SimpleDropCapPlugin->text_dropcap); 
    $SimpleDropCapPlugin->html .= "</span>"; 


    $row->text = preg_replace("#{dropcap}".$_temp."{/dropcap}#s", $SimpleDropCapPlugin->html , $row->text); 
    } 
} 

'|'

나는 함수를 생성 문자가 스크립트는 작동하지만 파이프 문자가 사용될 때마다 별도의 dropcap이 생성됩니다. 반면에 다른 분리자를 사용하는 경우 ':'스크립트가 정상적으로 작동합니다.

파이프 문자를 HTML에서 일반적으로 사용하지 않으므로이 플러그 문자 사용을 확장 할 수 있으므로이 이상한 동작을 막을 수있는 방법이 있습니까?

답변

3

문제는 '|' 정규식의 특수 문자입니다. 당신은 여기를 탈출 preg_quote를 사용해야합니다 :

$row->text = preg_replace("#{dropcap}".preg_quote($_temp,'#')."{/dropcap}#s", $SimpleDropCapPlugin->html , $row->text); 
사실

가, 심지어 정규 표현식에서 $ _temp를 포함 할 이유가 없다, 당신은이 작업을 수행 할 수 있습니다 :

$row->text = preg_replace("#{dropcap}.+?{/dropcap}#s", $SimpleDropCapPlugin->html , $row->text);

수정 사항 : 더 자세히 살펴보면 적어도 droptags가 여러 개인 텍스트의 전체 행을 대체하기 때문에 최소한 구현시 $ _temp를 사용해야합니다 그 안에.