使用正则表达式代码粘贴以将HTML标记应用于文本,但如果在<! - ? - >标记内部则排除

时间:2010-04-20 13:24:06

标签: regex coldfusion

  

可能重复:
  RegEx match open tags except XHTML self-contained tags

我正在尝试编写一些正则表达式,这些正则表达式将通过我们的编辑编写的一些文本,并将<acronym>标记应用于它找到的我们在“词汇表”中保存的缩写集的第一个实例条款“。

因此,对于此示例,我使用了缩写ITS

我认为我要做的第一件事就是设置一个示例,其中混合了我可以测试的场景,即ITS坐标点,HTML标签&amp;我们已经应用了这个(换句话说,脚本之前已经完成了这个,所以不需要再做了)。

我差不多到了最后一点: - (。

这是我到目前为止的正则表达式 - <[^<|]+?>?>ITS<[^<]+?>|ITS

示例 - FROM(每个 ITS IN BOLD 要用ACRONYM包装):

  

I want you to tag this ITS , but not this wrapped one - <acronym title="ITS" id="thisIsATest">ITS</acronym>

     

这是另一项测试,因为我仍然希望更新<p> ITS </p>,其他HTML标记会围绕它们。

     

ITS 想要那些开始句子和完成 ITS 的句子。 ITS ,以及用标点符号包裹的内容。

     

Test link:   <a href="index.cfm>ITS</a>


我想要改变:

  

I want you to tag this <acronym title="ITS">ITS</acronym>,但不包括这个 - <acronym title="ITS">ITS</acronym>

     

This is another test as I still want to update <acronym title="ITS">ITS</acronym>包含其他HTML标记。

     

<acronym title="ITS">ITS</acronym> want ones that start sentences and ones that finish <acronym title="ITS">ITS</acronym>. <acronym title="ITS">ITS</acronym>, and ones which are wrapped in punctuation.

     

Test link:   <acronym title="ITS"><a href="index.cfm>ITS</a></acronym>


那里有哪些Reg Ex专家可以帮我完成这项任务吗?任何其他提示技巧也将不胜感激。

**更新** 不知道这是否有帮助,但这会在该段中找到唯一的:

<acronym[^<]*ITS</acronym>

这将找到所有ITS:

<[^<]*>ITS<[^<]*>|ITS

我真正需要的是一种结合这些的方法,以便找到所有的ITS,但不包括标签中的那些。

非常感谢, 詹姆斯

P.S。如果这对任何具有特定语法的人都有帮助,那么这将放在ColdFusion应用程序中。


这是我要解析的HTML:

http://pastebin.com/5k32aG8i

2 个答案:

答案 0 :(得分:2)

这是您的基本问题:正则表达式不是解析器。已经多次接近这个问题,并且没有仅使用正则表达式的通用解决方案。你可以通过使用前瞻,后瞻和一些非常复杂的步法将它伪装成一个点,但是你很快就会达到你的表达难以维持的程度。

我可以建议一些方法。

如果您使用的是符合XML的文本,则可以使用xmlparse()解析文本,然后逐步执行生成的结构,将正则表达式应用于每个节点的xmltext。

或者,您可以尝试使用占位符替换文本块中的每个标记,对生成的文本执行替换,然后还原占位符。

显然,这些都不是完美的,但要么通过一些调整,可能会让你到达目的地。

答案 1 :(得分:0)

这有用吗?

(?!(<acronym\W*>|\w))ITS(?!(<acronym\W*>|\w))

由于我没有ColdFusion,所以没有经过测试

看起来ColdFusion不支持lookbehinds。但是,您仍然可以使用前瞻((?!...))来确保字符串(ITS)后面没有</acronym>

\\WITS(?!(</acronym\\W*>|\\w))

由于你不能使用lookbehinds,你需要\ W在开头确保字符串不是另一个单词的一部分。不幸的是,如果匹配,它会占用前一个字符。最后的\ w也确保它不是一个单词的一部分。