【问题标题】:Stuck with php regular expression坚持使用 php 正则表达式
【发布时间】:2013-05-12 09:38:20
【问题描述】:

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

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

<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,第二个是 LI)
  3. ##ENDLOOP## 之后的文本

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

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

我正在使用 PHP preg_match_all 函数

请帮忙?

【问题讨论】:

  • 这不是重复的,添加的帖子是关于HTML解析的,而这是关于PHP解析的......
  • 再看一遍,都与“如何使用PHP解析HTML”有关,只有HTML代码解析变化。

标签: php regex preg-match-all


【解决方案1】:

正则表达式接近正确。只是一些注意事项:

[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

【讨论】:

  • 我的问题不在于那部分,问题是我无法在##BEGINLOOP##...##ENDLOOP## ..? 之外捕获组?
  • 添加了一个 preg_split 示例。
【解决方案2】:

尝试:

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

var_dump($matches);

【讨论】:

  • 这不是正确的组,在第一组它给了我&lt;div class="tabs_container"&gt; &lt;ul class="tabs"&gt; ##BEGINLOOP##gAs## &lt;li&gt;&lt;a href="#"&gt;##title##&lt;/a&gt;&lt;/li&gt; ##ENDLOOP##
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多