1

HTMLコメントを自動的に処理するJoomlaのプラグインを書いています。{dropcap} B{/dropcap}そしてドロップキャップスタイルを作成します。

プラグインにパラメータを渡す方法が必要だったので、{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 );
  }
}

'|'を使用する場合 文字スクリプトは機能しますが、パイプ文字が使用されるたびに個別のドロップキャップが作成されますが、別の区切り文字を使用する場合などです。':'スクリプトは正常に機能します。

パイプ文字は通常HTMLで使用されないため、プラグインの使用を拡張できるので、絶対に使用したいと思います。この奇妙な動作を停止する方法はありますか?

4

1 に答える 1

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

訂正: 詳しく調べてみると、少なくとも実装では $_temp を使用する必要があります。これは、複数のドロップタグを含む可能性のあるテキストの行全体を置き換えているためです。

于 2009-06-08T20:27:57.347 に答える