【问题标题】:Regex to find a string between 2 strings that are between 2 strings of which the substrings can't contain a word正则表达式在 2 个字符串之间查找一个字符串,该字符串在 2 个子字符串不能包含单词的字符串之间
【发布时间】:2012-09-01 00:47:26
【问题描述】:

我的问题的标题有点复杂,我知道,但这基本上是我想做的:

假设我有这段文字:

[table]
[tr]
[td]test str 1[/td]
[td]test str 2[/td]
[/tr]
[/table]

是否有一个正则表达式,可以让我找到:

  • [td] 和 [/td] 标签之间的字符串
  • 其中从[td]到[/td]的整个部分本身就在[table]和[/table]标签之间
  • 并且[table]和[td]标签之间的文本不能包含[/table]标签
  • [/td] 和 [/table] 标记之间的文本不能包含
    [表格]标签

这听起来很明显,但它应该是一个安全的正则表达式,因为这个正则表达式将用于处理用户输入,以及如果用户要在表格之外输入 [td](所有标签都转换为 html) ,它可能会影响用于我网站页面布局的表格。

所以它应该首先匹配“test str 1”,然后再匹配“test str 2”,但前提是该字符串位于 td 标签内,而 td 标签又应位于可能不在其间的表标签内另一个表格标签。

这是我得到的最接近的:

/\[table(.*?)\]((?!\[\/table\]).*?)\[td(.*?)\](.*?)\[\/td\]((?!\[table(.*?)\]).*?)\[\/table\]/si

但我认为我在 table 标签不应该存在的部分遗漏了一些东西,所以在 table 和 td 标签之间。

【问题讨论】:

  • Don't regex html。只需编写一个解析器,或使用一个库。
  • 您有更好的方法来解析这个 non HTML 内容吗? @zellio
  • 如果我要解析非常规语言,我会使用解析器。这只是html。将 <> 更改为 [] 不会改变它。它接受用户输入并转换为 HTML。
  • 虽然我同意关于不是适合该工作的工具的观点,但对于某些事情没有解析器^^(不知道这里是否是这种情况,因为我不知道这些东西是从哪里来的)
  • 好吧,我不能使用解析器,因为我需要在只接受正则表达式的 php 环境中执行此操作。我正在将它写在一个论坛软件的插件中,它只接受 php 环境中的正则表达式。这是一个真正的痛苦,但我知道这应该是可能的,我认为我的正则表达式非常接近解决方案,我只是找不到丢失的链接。

标签: php regex html-table negative-lookahead


【解决方案1】:

HTML 是一种上下文无关语言,而正则表达式用于正则语言。如果您查看形式语言的乔姆斯基层次结构,您会发现您尝试做的事情不可能以任何可靠的方式完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多