2009-06-08 8 views
1

私は、Joomlaのプラグインを使ってHTMLコメントを自動的に処理しています。 {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を使用する必要があります その中に。