【问题标题】:Stuck with regexp卡住了正则表达式
【发布时间】:2011-12-08 23:26:24
【问题描述】:

我坚持使用 php preg_match_all 函数。也许有人会帮助我使用正则表达式。假设我们有一些代码:

[a]a[/a]
[s]a[/s]
[b]1[/b]
[b]2[/b]
...
...
[b]n[/b]
[e]a[/e]
[b]8[/b]
[b]9[/b]
...
...
[b]n[/b]

我需要匹配位于[s][e] 标签之间的[b] 标签内的所有内容。有什么想法吗?

【问题讨论】:

  • 您是说在两个 [s] 标签或两个 [e] 标签之间或在 [s] 标签和 [e] 标签之间匹配 [b] 标签的内容?
  • 我的意思是和。在上面给出的例子中,结果应该是:1,2,..,n
  • 根据您的输入,您能否举例说明您想要的结果?

标签: php regex preg-match-all


【解决方案1】:

如果您的结构与上述完全相同,我个人会避免使用正则表达式(对于这些语言来说这不是一个好主意),只需检查每行的第二个字符。一旦你看到 s 进入消费模式,对于每一行直到你看到 e 找到第一个 ] 并读取它和下一个 [ 之间的所有内容

【讨论】:

    【解决方案2】:

    为简单起见,使用两个 preg_match 调用。

    首先检索您要检查的列表/\[s](.+?)\[e]/s
    然后使用该结果字符串并匹配包含的 /\[b](.+?)\[\/b]/s 事物。

    【讨论】:

    • 有什么方法可以一步完成吗?
    【解决方案3】:

    看起来您正在尝试对具有树状结构的内容进行模式匹配,本质上类似于 HTML 或 XML。每当您发现自己说“在匹配的 Y 标记内查找 X”时,您都会遇到这个问题。

    尝试使用正则表达式进行此类工作是个坏主意。

    这是从different answer of mine for a similar question 复制/粘贴的一些信息:

    对类似 SO 帖子的一些参考可以让您了解您遇到的困难:

    要做的“正确的事情”是解析您的输入,并随时保持状态。这可以像扫描文本并保留一堆当前标签一样简单。

    【讨论】:

      【解决方案4】:

      单独的正则表达式不足以解析 XML,这似乎是一种简化的 XML 语言。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 2020-09-14
        • 2020-06-14
        • 2011-10-10
        • 1970-01-01
        • 2023-03-17
        • 2016-06-11
        相关资源
        最近更新 更多