PHP preg_match_all剪切文本元素

时间:2014-11-29 11:32:27

标签: php regex preg-match-all

有个问题。

我有一个HTML字符串,我已导入PHP。 file_get_contents。 我想做的是在 {{ [tagname] [/ tagname] <等标签的手上剪下一些字符串/ p>

然后将它们返回到数组中,以便我可以处理它们。 例如:

{{header.tpl}} 让PHP加载 header.tpl 文件并将 {{header.tpl}} 替换为它的内容。

我认为正则表达式是要走的路。但这正是我的弱点所在。我试过但没有用。

我得到了以下代码:

<?php

$text = '
            Hi this is a text<br />
            [@title]
            <br />
            {{header.tpl}}
            <br /><a href="#">link</a>{{menu.tpl}}<br />
            <hr/>
            <h1>[@subtitle]</h1>
            [@content]
            {submenu}
                {itemactive}<a href="#"><strong>[@link]</strong></a>{/itemactive}
                {itema}<a href="#">[@link]</a>{/item}
            {/submenu}

            ';


$pattern = '^\{{.*}}^';

preg_match_all($pattern, $text, $matches, PREG_SET_ORDER);

print_r($matches);
?>

虽然它给出了一些结果。

Array
(
    [0] => Array
        (
            [0] => {{header.tpl}}
        )

    [1] => Array
        (
            [0] => {{menu.tpl}}
        )

)
这是我想要的吗? 不,但.... 关闭! 因为当我使用现在格式良好的$text字符串作为一个长字符串时。

喜欢:

$text = 'Hi this is a text<br />[@title]<br />{{header.tpl}}<br /><a href="#">link</a>{{menu.tpl}}<br /><hr/><h1>[@subtitle]</h1>[@content]';

出错了!

结果将变为:

    Array
(
    [0] => Array
        (
            [0] => {{header.tpl}}<br /><a href="#">link</a>{{menu.tpl}}
        )

)

即便如此,我希望结果与上面的结果一样! 然后第二个问题......

我想我应该使用相同的选项来获取子菜单。 类似的东西:

$pattern = '^\{submenu}.*{/submenu}^';

但奇怪的是,这不起作用。 :-( 而我得到的只是:

    Array
(
)

有人能告诉我我做错了吗?

TIAD !!

1 个答案:

答案 0 :(得分:1)

你在哪里关闭。

问题^\{{.*}}^

  • .*贪婪且会匹配任何内容,直到下一个}}更改为非贪婪.*?或下面的正则表达式。

更好正则表达式

\{\{[^}]+}}

示例:http://regex101.com/r/gF4jZ6/1

  • \{\{{{

  • 相匹配
  • [^}]+匹配}

  • 以外的任何内容
  • }}匹配}}

将输出

Array ( [0] => Array ( [0] => {{header.tpl}} ) [1] => Array ( [0] => {{menu.tpl}} ) )

注意了解两个正则表达式之间的差异,请参阅this link

现在inoder匹配子菜单,只需添加s标记,以便.匹配新行

$pattern = '/\{submenu}.*?{\/submenu}/s';