用正则表达式的代码卡住应用HTML标签的文本,但如果排除里面标签

问题描述:

可能重复:
RegEx match open tags except XHTML self-contained tags用正则表达式的代码卡住应用HTML标签的文本,但如果排除里面<?>标签

我想写一点正则表达式这将请阅读由我们的编辑撰写的一些文本,并将<acronym>标签应用到它找到的我们的“术语词汇表”中的缩写集的第一个实例。

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

我想我做的第一个事情是设置与scenerios的组合我可以测试反对,即ITS坐在标点符号,HTML标签&那些我们已经应用了已经(换句话说为例脚本之前已经完成了,所以不需要再做)。

我几乎没有,但只是卡住在最后一个点:-(

这里是到目前为止,我已经得到了正则表达式 - <[^<|]+?>?>ITS<[^<]+?>|ITS

的例子 - 从(每周ITS IN BOLD要与缩略WRAPPED):

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

这又是一个考验,因为我还是想更新<p>ITS</p>有各地them.`

包裹其它的HTML标签及其希望那些开始的句子和那些完成ITSITS,和那些被包裹在punctuation.`

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标签周围them.`

<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>


包裹是否有任何注册防爆专家在那里,可以帮助我完成这一关?任何其他提示提示也将不胜感激。

**更新** 不知道如果这有助于但这会发现仅在该段:

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

,这会发现所有的ITS:

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

我真正需要的是一种组合这些的方式来说找到所有的ITS,但排除标签中的那些。

非常感谢, 詹姆斯

附:如果这可以帮助任何人使用特定的语法,这将被放置在ColdFusion应用程序中。


这里的HTML我试图解析:

http://pastebin.com/5k32aG8i

+0

使用反引号进行内联代码;新行上的4个空格将为您提供一个代码块。 – 2010-04-20 13:37:28

+0

我把一些格式化,但我不知道它现在是否准确地问你的问题,所以看看。你的意思是你的测试链接实际上是功能性的吗?如果是这样,你需要完整的链接('http:// ...'),而不仅仅是你提供的相关链接。 – 2010-04-20 13:43:12

+0

感谢您的帮助B.希望现在看起来更好一点:-) – 2010-04-20 14:31:43

工作的呢?

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

没有经过测试,因为我没有的ColdFusion

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

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

既然你不能使用lookbehinds,你需要\ W在开始的时候,以确保该字符串不是另一个词的一部分。不幸的是,如果匹配,它会吃掉前一个字符。 \ w在最后也确保它不是一个单词的一部分。

+0

感谢您的帮助Szupie。我在gskinner中试过。com正在使用的RegExr应用程序,现在它不会突出显示任何内容。 – 2010-04-20 14:19:10

+0

嗯,我搞砸了。此外,ColdFusion不支持向后看,所以开始部分是不好的。我编辑了一个新模式。 – szupie 2010-04-20 23:37:41

这是你的基本问题:正则表达式不是解析器。这个问题已经被多次讨论过了,只有正则表达式没有通用的解决方案。通过使用前瞻,后视和一些非常复杂的步法,你可以将它伪装成一个点,但是你很快就会发现你的表情很难维护。

我可以建议一对夫妇的方法。

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

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

显然,这些都不是完美的,但是,或者,通过一些调整,可能会让你去你要去的地方。

+0

感谢Ben的输入。真的,我所要做的是一条规则,“在每个不在之内的ITS周围包装”。我不需要检查每个标签等。 为了使事情变得简单,虽然该示例没有显示,但我们只是希望将其应用于文本中的第一个实例,而不是所有人,所以我希望这不是太复杂(他说!!)。 干杯, James – 2010-04-20 15:19:59

+0

避免已经包装的实例可能会用我建议的第二种方法最好的完成。我想我误解或读入你的帖子,你还需要避免text,所以你不要断开链接(和图像,链接的脚本,等等)。 – 2010-04-20 16:21:30

+0

“这个问题已经过很多次了”是一种轻描淡写。 “用正则表达式解析HTML”问题在SO上每45分钟就会显示一次:p – womp 2010-04-20 23:49:29