坚持使用php正则表达式

时间:2013-05-12 09:38:21

标签: php regex preg-match-all

所以我一直试图找出正则表达式来捕获我的数据的多个部分但是,似乎我自从过去两天以来一直在失败...... :(

请帮忙 让我们说以下是我的数据:

<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>

我希望捕获以下群组:

  1. ## BEGINLOOP ##
  2. 之前的文字
  3. ## BEGINLOOP ##之后和##之前的文本(第一个是gAs,第二个是LI)
  4. ## ENDLOOP ##
  5. 之后的文字

    我一直在尝试各种正则表达式组合,但没有任何方法可以为我提供确切的解决方案。  这是我的最后一次尝试

    '/(?:##BEGINLOOP##)([a-z|A-Z]*)##(.+?)(?=##ENDLOOP##)(?:##ENDLOOP##)/s'
    

    我正在使用PHP preg_match_all函数

    请帮帮忙?

2 个答案:

答案 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);