如果文本尚未包装在超链接中,如何在超链接中包装文本

时间:2009-07-28 02:23:07

标签: regex

我需要做一个正则表达式替换,我拿一个字符串并在它周围包裹一个超链接(但这里是捕获),只要它还没有被超链接包围。我该怎么做?

所以,例如,让我们来看看文字:

The quick brown fox.

我想把“快速褐色”链接起来,就像这样:

The <a href="http://www.stackoverflow.com/">quick brown</a> fox.

但如果我找到了文字:

The <a href="http://www.stackoverflow.com/">quick brown</a> fox.

我想确定我没有在另一个超链接中包装“quick brown”。

我该怎么做?

4 个答案:

答案 0 :(得分:1)

Lookarounds可以让你到达某个地方。虽然不完美,但这里有一个快速的正则表达式检查,看看你的文本是否已经用锚标签包装。

(?<=>)quick brown(?=</a>)

注意:lookbehind断言需要固定长度(至少在PCRE中)。

答案 1 :(得分:1)

如果要包裹链接的字符串为YOUR_STRING,请首先标识YOUR_STRING被链接标记包围的所有位置。

regex = <a[^>]*>[^<]*(YOUR_STRING)[^<]*</a>

<a

开头

后跟一个长度为零或更长的序列,不包含>

后跟>

后跟一个长度为零或更长的序列,不包含<

后跟YOUR_STRING这是一个捕获组。

后跟一个长度为零或更长的序列,不包含<

后跟</a>

现在,您可以识别捕获的组YOUR_STRING被链接标记包围的位置的字符偏移量。

除了这些地方之外,在字面上出现YOUR_STRING的所有其他地方,请将链接标记包裹在其周围。

加分点:请注意,当您将文本插入字符串时,您可以更改字符偏移量,或者您的正则表达式可能会抛出ConcurrentModificationException /不允许您在分析时插入文本(取决于你正在使用什么图书馆。处理此问题的最佳方法是创建一个单独的StringBuffer,并在分析原始字符串时将文本附加到其中。

另请注意:识别超链接标记的正则表达式可以更智能地编写(对于正确的html),但这也适用于糟糕的html。例如。缺少href属性,例如<a>quick brown fox</a>。如果您期望的HTML可能不完美,并且您想要处理这些问题,那么您应该相应地修改正则表达式。

希望它有效。

答案 2 :(得分:1)

不是查看关键字,而是在网址上进行简单匹配可能更容易,如果在“原始”html中找不到网址,则只能替换关键字

答案 3 :(得分:0)

好像你正在解析渲染的html,如果是这样的话,为什么不解析原始的html?然后问题变得微不足道