如何使用preg_match提取自定义标签

时间:2011-06-14 06:18:34

标签: php regex preg-match

我使用此模式'/(\{(\w+)\}(.*))?\{%(\w+)%\}((.*)\{\/(\w+)\})?/i'使用preg_match函数从模板中提取标记。

示例模板:

<table id="middle" cellspacing="0px" cellpadding="0px">
    {middle}
    <tr>
        {left}<td>{%left%}</td>{/left}
        <td>{%middle%}{%content%}</td>
        {right}<td>{%right%}</td>{/right}
    </tr>
    {/middle}
</table>

如何确保每个代码的startend与其名称相匹配 在此示例中,middle标记与middlecontent匹配,但它应与middle标记匹配

2 个答案:

答案 0 :(得分:1)

我认为解决这个问题的最佳方法是在几个不同的步骤中完成。

首先,您应该使用preg_replace_callback /(?>{([^}]+)})(.*)?{\/\1}/sim作为正则表达式。这将找到顶级{tag} {/ tag}。 $ matches [2]将包含内容(不包含标签),而$ matches 1将包含标签本身。

你应该创建一个递归调用的函数,这样在回调中,它会在$ matches [2]上再次调用,所以找到子{tag}以防万一。这就是你将如何通过树。

最后,您应该创建一个处理{%tag%}的第三个函数。我会再次使用preg_replace_callback并使用switch语句来处理标记名称。

这应该指向正确的方向。

编辑:以下是我上述内容的全功能演示: \

<?php

$content = <<<END
{a}
  {b}I like {%first%} {%last%} a {c}lot{/c}.{/b}
{/a}
END;

echo find_tags($content);

function find_tags($content)
{
  return preg_replace_callback('/(?>{([^}]+)})(.*)?{\/\1}/sim', 'find_tags_callback', $content);
}

function find_tags_callback($matches)
{
  // Find and process any children tag pairs.
  $matches[2] = find_tags($matches[2]);

  // Process the tags {%tag%}.
  $matches[2] = preg_replace_callback('/{%([^%]+)%}/sim', 'process_tags', $matches[2]);

  switch ( $matches[1] )
  {
    case 'a':
      $tag = 'div';

      break;
    case 'b':
      $tag = 'p';

      break;
    case 'c':
      $tag = 'b';

      break;
  }

  return '<'.$tag.'>'.$matches[2].'</'.$tag.'>';
}

function process_tags($matches)
{
  switch ( $matches[1] )
  {
    case 'first':
      return 'Francois';

      break;
    case 'last':
      return 'Deschenes';

      break;
  }
}

//

结果字符串为:<div><p>I like Francois Deschenes a <b>lot</b>.</p></div>

答案 1 :(得分:0)

1我有信心但不确定,为了确保封闭标签({this} {/ this})与数据标签匹配({%this%}),您需要一个附带的if语句来测试返回字符串。

我会使用preg_replace_callback函数,如下所示:

<?php
$str = '<template contents>';
$newstr = preg_replace_callback(
'/(\{(\w+)\}(.*))?\{%(\w+)%\}((.*)\{\/(\w+)\})?/i', 
'check', //<-- the function to send matches to
$str);
function check($matches){
    if($matches[1] == $matches[2] && $matches[1] == $matches[3]){
        /*Do Work*/
        return ''; //new formatted string to send back to the $newstr var
    }
}
?>

preg_replace_callback函数将作为数组找到的所有匹配项发送到指定的函数进行处理,然后从该函数返回新格式化的字符串。