正则表达式查找不在HTML标记内的短语

时间:2010-05-05 14:25:30

标签: regex coldfusion

我正在用这个正则表达式挣扎,并想知道是否有人要帮助我吗?

我需要做的是隔离不在HTML标记内的字符串中的第一个短语。所以我现在的例子是:

This is some test text about <acronym
title="Incomplete Test Syndrome"
class="CustomClass">ITS</acronym> for
the **ITS** department. Also worth
mentioning ABS as well I guess.ITS,

......和......

This is some **ITS** test text about
<acronym title="Incomplete Test
Syndrome"
class="GOTManager">ITS</acronym> for
the ITS department. Also worth
mentioning ABS as well I guess

所以在第一个例子中,我希望它忽略包装的ITS,并在第一句末尾给我ITS。

在第二个例子中,我希望它在第二句开头返回ITS。

目的是在我正在编写的ColdFusion应用程序中用我自己的自定义包装缩写标签替换它们。

非常感谢, 詹姆斯

3 个答案:

答案 0 :(得分:3)

正如评论员指出的那样,正则表达式不是处理类似XML / HTML的文本的好工具。那是因为“内部”某些东西很难在任何一般性中检查(你永远不知道在哪些可能的无限嵌套级别中)。

但是,对于您的特定示例,可以这样做。这很大程度上依赖于没有任何嵌套标签。如果你这样做,你应该认真尝试不同的方法。

您的示例适用于

^(?:<[^<]*<[^>]*>|.)*?(ITS)

这匹配整个字符串直到ITS的第一次出现而不是在标记中(并且在第一个捕获组中有这个),但是应该很容易提取您需要的数据。只有匹配此ITS实例是不可能的,因为正则表达式的实现不支持任意长度的后视。

询问您是否需要/需要解释的表达式。 =)

答案 1 :(得分:0)

当你问一个非常相似的问题时,我会告诉你同样的事情: Stuck with Regular Expression code to apply HTML tag to text but exclude if inside <?> tag

您无法使用纯正则表达式解析HTML(包括嵌套元素)。这是正则表达式的一个已知限制,并且有很好的文档记录。

您可以尝试安装和使用带扩展名的外部正则表达式引擎,这可能有效。您可以手动遍历字符串,计算嵌套数,以查看您正在查看的字符串是否已包装。您可以使用真正的HTML解析器,例如WebKIT在外部执行此操作。

但你不能用正则表达式做到这一点。请寻找替代方案。哎呀,我们甚至会帮忙。

答案 2 :(得分:0)

你说:

  

目的是用我的替换这些   自己定制包装的首字母缩略词标签   ColdFusion应用程序我正在写。

听起来使用XSL可能比正则表达式更适合将一个标签转换为另一个标签。

<强>更新

只是将它们放在一起,它似乎适用于简单的情况:

(注意:这将简单地删除'首字母缩略词'标签。您可以使用XSL将它们替换为您自己的自定义标签,但是您没有在这些行中指定任何内容,所以我没有进入那)

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="*[name() = 'acronym']" />
</xsl:stylesheet>

输入:

<?xml version="1.0" encoding="UTF-8"?>
<root>
This is some test text about <acronym
title="Incomplete Test Syndrome"
class="CustomClass">ITS</acronym> for
the **ITS** department. Also worth
mentioning ABS as well I guess.ITS,

This is some **ITS** test text about
<acronym title="Incomplete Test
Syndrome"
class="GOTManager">ITS</acronym> for
the ITS department. Also worth
mentioning ABS as well I guess
</root>

输出:

<?xml version="1.0" encoding="UTF-8"?>
This is some test text about  for
the **ITS** department. Also worth
mentioning ABS as well I guess.ITS,

This is some **ITS** test text about
 for
the ITS department. Also worth
mentioning ABS as well I guess

<强>更新

你说:

  

所以在我想要的第一个例子中   忽略包裹的ITS并给我   ITS在第一句末尾。

     

在第二个例子中我想要它   在第2个开始时返回ITS   句。

这没有任何意义。你的第二个例子在第二句中没有“ITS”。我认为你的意思是**ITS**是你想要提取的。

我给出的XSL示例只剥离了<acronym/>标签,但在完成之后你可以尝试在句子的不同点找到ITS,也许正是因为正则表达式可能很容易(这个假设您只需要担心<acronym/>标签。