如何使用ColdFusion中的正则表达式替换所有锚标记与不同的锚点

时间:2015-02-09 22:04:57

标签: regex coldfusion

我在这里找到了类似的问题:Wrap URL within a string with a href tags using Coldfusion

但我想要做的是在用户将标签提交到服务器之后用稍微修改过的版本替换标签。因此,这是用户将提交给服务器的一些典型HTML文本:

<p>Terminator Genisys is an upcoming 2015 American science fiction action film directed by Alan Taylor. You can find out more by <a href="http://www.imdb.com">clicking here</a></p>

我想要做的是用新版本替换<a href="">部分,如下所示:

...
<a href="http://www.imdb.com" rel="nofollow noreferrer">clicking here</a>

所以我只是将文字rel="nofollow noreferrer"添加到代码中。

我必须将包含href属性的锚标记与URL匹配,而不仅仅是URL字符串本身,因为有时用户可以这样做:

<p>Terminator Genisys is an upcoming 2015 American science fiction action film directed by Alan Taylor. You can find out more by <a href=""http://www.imdb.com">http://www.imdb.com</a></p>

在这种情况下,我仍然只想替换标签。我不想触摸使用的实际锚文本,即使它是一个URL。

那我怎么能重写这个正则表达式

#REReplaceNoCase(myStr, "(\bhttp://[a-z0-9\.\-_:~@##%&/?+=]+)", "<a href=""\1"">\1</a>", "all")#

反过来说,它选择标签并用我修改后的文本替换它们?

1 个答案:

答案 0 :(得分:2)

如果你愿意,对于jQuery(客户端)来说这是一个非常简单的任务

JSFiddle:http://jsfiddle.net/mz1rwo0u/

$(document).ready(function () {
$("a").each(function(e) {
  if ($(this).attr('href').match(/^https?:\/\/(www\.)?imdb\.com/i)) {
    $(this).attr('rel','nofollow noreferrer');
  }});
});

(如果右键单击任何imdb链接和Inspect Element,您将看到rel属性已添加到imdb链接。请注意View Source不会反映更改,但{ {1}}是重要的部分。)

如果您希望影响每个链接,可以执行此操作。

Inspect Element

最后,您还可以使用选择器缩小范围,将内容加载到ID为$(document).ready(function () { $("a").each(function(e) { $(this).attr('rel','nofollow noreferrer'); }); }); 的dom元素中。你可以做......

contentSection

在冷融合中可靠地解析它有点困难而不会意外地添加它两次(没有调用像jSoup这样的工具)但是jQuery版本是客户端并且通过从DOM获取数据而不是尝试热线连接(jSoup实现类似,创建一个类似DOM的结构)。

在讨论客户端和服务器端时,你必须考虑没有启用javascript的神话用户(或者是出于恶意目的而将其关闭的用户)。如果此功能不是关键任务。我会用JQuery来做。当用户点击我的某个网站上的外部链接时,我使用了类似的功能来弹出警告框。

这是一个快速而又脏的jSoup实现。 jSoup非常适合与jQuery类似的选择。

$(document).ready(function () {
$("#contentSection a").each(function(e) {
  if ($(this).attr('href').match(/^https?:\/\/(www\.)?imdb\.com/i)) {
    $(this).attr('rel','nofollow noreferrer');
  }});
});