【发布时间】: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