PHP正则表达式中的管道问题

时间:2009-06-08 20:15:05

标签: php regex joomla1.5 pipe

我一直在为Joomla编写一个自动处理HTML注释的插件,例如。 {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 );
  }
}

如果我使用'|'脚本工作的字符,但每次使用管道字符时创建一个单独的dropcap,而如果我使用不同的分隔符,例如。 ':'脚本运行正常。

我肯定想使用管道字符,因为它通常不在HTML中使用,所以我可以扩展插件的用法,有什么方法可以阻止这种奇怪的行为吗?

1 个答案:

答案 0 :(得分: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,至少在您的实现中,因为您要替换可能有多个droptags的整行文本。