所以我一直试图找出正则表达式来捕获我的数据的多个部分但是,似乎我自从过去两天以来一直在失败...... :(
请帮忙 让我们说以下是我的数据:
<div class="tabs_container">
<ul class="tabs">
##BEGINLOOP##gAs##
<li><a href="#">##title##</a></li>
##ENDLOOP##
</ul>
##BEGINLOOP##LI##
<div class="tabs_content">##title## is ##content##</div>
##ENDLOOP##
</div>
我希望捕获以下群组:
我一直在尝试各种正则表达式组合,但没有任何方法可以为我提供确切的解决方案。 这是我的最后一次尝试
'/(?:##BEGINLOOP##)([a-z|A-Z]*)##(.+?)(?=##ENDLOOP##)(?:##ENDLOOP##)/s'
我正在使用PHP preg_match_all函数
请帮帮忙?
答案 0 :(得分:2)
正则表达式接近正确。只是几点说明:
[a-z|A-Z]
并不代表您认为的含义。这意味着接受从a到z的所有字符,以及char |和从A到Z的所有字符。你想要[a-zA-Z]
。
(?=##ENDLOOP##)
表示只有前面有##ENDLOOP##
的情况下,下一个小组才会匹配,因此##ENDLOOP##
仅在前面有##ENDLOOP##
时匹配。您可能想要删除(?=##ENDLOOP##)
。
这有效:
'/(?:##BEGINLOOP##)([a-zA-Z]*)##(.+?)(?:##ENDLOOP##)/s'
在此处试试:http://3v4l.org/aCvvY
如果您还希望捕获## BEGINLOOP ## ... ## ENDLOOP ##之外的部分,对于整个文档,preg_split可以完成工作:
$parts = preg_split('/(?:##BEGINLOOP##)([a-zA-Z]*)##(.+?)(?:##ENDLOOP##)/s', $subject, -1, PREG_SPLIT_DELIM_CAPTURE);
在此处试试:http://3v4l.org/LWaQS
答案 1 :(得分:0)
尝试:
preg_match('@(.*?)##BEGINLOOP##(.*?)##(.*?)##ENDLOOP##(.*?)@s', $data, $matches);
var_dump($matches);