我知道我问题的标题有点复杂,但基本上我想做的是:
假设我有一段文字:
[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]标记之间的文本不能包含
[table]标记
这听起来可能很明显,但它应该是一个安全的正则表达式,因为这个正则表达式将用于处理用户输入,如果用户在表外输入[td](所有标记都转换为html),它可能会影响用于我的网站页面布局的表。
因此,它应该首先匹配"test-str 1",然后匹配"teststr 2",但前提是该字符串在td标记内,而td标记又应该在表标记内,表标记之间可能不是另一个表标记。
这是我得到的最接近的:
/'[table(.*?)']((?!'['/table']).*?)'[td(.*?)'](.*?)'['/td']((?!'[table(.*?)']).*?)'['/table']/si
但我想我在表标记不应该存在的部分遗漏了一些东西,所以在表和td标记之间。
HTML是一种上下文无关语言,而正则表达式适用于正则语言。如果你看看乔姆斯基的形式语言层次结构,你会发现你试图做的事情不可能以任何可靠的方式做到。