正则表达式在2个字符串之间找到一个字符串,该字符串位于2个字符串之间,其中子字符串不能包含单词

时间:2012-09-01 00:47:27

标签: php regex html-table negative-lookahead

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

说我有这段文字:

[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”匹配,然后在下一个“test str 2”中匹配,但前提是该字符串在td标记内,而td标记又应该位于表之间的标记之间另一个表标签。

这就像我得到的那样接近:

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

但是我觉得我在表标签不应该存在的部分缺少一些东西,所以在表和td标签之间。

1 个答案:

答案 0 :(得分:1)

HTML是无上下文语言,而正则表达式是常规语言。如果你看一下正式语言的乔姆斯基层次结构,你会发现你想做的事情是不可能以任何可靠的方式做的。