有个问题。
我有一个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 !!
答案 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';