0

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

请帮助假设以下是我的数据:

<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. ##BEGINLOOP## 之后和 ## 之前的文本(gAs in first and LI in second)
  3. ##ENDLOOP##之后的文本

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

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

我正在使用 PHP preg_match_all 函数

请帮忙 ?

4

2 回答 2

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

于 2013-05-12T09:44:51.500 回答
0

尝试:

preg_match('@(.*?)##BEGINLOOP##(.*?)##(.*?)##ENDLOOP##(.*?)@s', $data, $matches);

var_dump($matches);
于 2013-05-12T09:44:36.527 回答