Javascript正则表达式用于urlify文本

时间:2013-06-18 20:26:29

标签: javascript regex text

在包含大量以下网址标记的字符串中 -

[http://www.someurl.com/path/to/resource/?some=params&crazy_chars=true_0_1_0_1]

我想要捕获并转换为

<a href="http://www.someurl.com/path/to/resource/?some=params&crazy_chars=true_0_1_0_1" target="_blank" class="exturl">http://www.someurl.com/path/to/resource/?some=params&crazy_chars=true_0_1_0_1</a>

因此,方括号内的所有网址都将被搜索,并被内联网址替换为元素。目前我发现URL模式的正则表达式为 -

RegExp("\[(http|ftp|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:/~+#-]*[\w@?^=%&amp;/~+#-])?\]", "gi");

但是我仍然不清楚如何在单程中做到这一点。我是否必须循环才能找到匹配器?

4 个答案:

答案 0 :(得分:1)

  

目前我找到了网址格式的正则表达式

但它的目的是成为一个正则表达式文字,而不是RegExp构造函数的字符串参数。所有反斜杠都会对以下字符进行字符串转义,并且在正则表达式中没有任何效果。相反,使用

/\[(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?\]/gi
  

但是我仍然不清楚如何在单程中做到这一点。我是否必须循环才能找到匹配器?

不,一个简单的replace call就足够了。您可以在网址周围放置capturing group(方括号之间),然后使用替换字符串中的捕获:

var regex = /\[((?:ftp|http)s?:\/\/[\w-]+(?:\.[\w-]+)+(?:[\w.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?)\]/gi;
// here:       ^                                                                                       ^
// (the non-capturing groups are optional)
urlified = text.replace(regex, '<a href="$1" class="exturl">$1</a>');
// here:                                 ^^                 ^^

对于更高级的替换规则,您可以使用replace的回调函数参数。

当然,您可能(应该)使用其他答案建议的正则表达式改进/简化。

答案 1 :(得分:0)

我会编写一个辅助函数,它将一个url字符串作为输入,并在匹配时返回带有该url的锚标记。将大字符串解析为数组,每个元素与对应的[]对匹配。然后,只需迭代这个数组并将其传递给辅助函数:

function urlify(s)
{
  var urlpat = /\[((https?|ftp):\/\/\w+[^\]]*)\]/i;

  var matches = urlpat.exec(s);
  var anchor_url = '<a href="%1">%1</a>';
  return matches ? anchor_url.replace(/%1/g, matches[1]) : '';
}

instring = '[http://www.someurl.com/path/to/resource/?some=params&crazy_chars=true_0_1_0_1]' +
           '[@ID 65421]' +
           '[http://google.com]';

var arr = instring.match( /(\[[^\]]+\])/g );
for(var each in arr)
{
  arr[each] = urlify(arr[each]);
}

arr将包含:

[ '<a href="http://www.someurl.com/path/to/resource/some=params&crazy_chars=true_0_1_0_1">http://www.someurl.com/path/to/resource/?some=params&crazy_chars=true_0_1_0_1</a>',
  '',
  '<a href="http://google.com">http://google.com</a>' ]

答案 2 :(得分:0)

JavaScript的正则表达式与Java相同。

JTexy project(像MarkDown,但更好) 有很多关于各种任务的正则表达式,包括 URL matching

 #(?<=^|[\\s(\\[<:\\x17])(?:https?://|www\\.|ftp://)[0-9.$TEXY_CHAR-][/\\d$TEXY_CHAR+\\.~%&?@=_:;\\#,\\xAD-]+[/\\d$TEXY_CHAR+~%?@=_\\#]#u

$TEXY_CHAR在项目的某处定义。

顺便说一下,使用括号括起URL并不是一个好主意,例如PHP使用[...]来初始化哈希值,通常用于复选框。

答案 3 :(得分:0)

我们假设:

  • 没有递归[[]]
  • 没有空[]
  • 网址从不包含括号,符号也不清晰
  • 除了[url],[@ ID342892904],[#some标签]包含括号

然后这个简单的正则表达式将起到作用:

\[[^@#]+\]
  • \[匹配一个左括号(符号需要转义)
  • [^@#]+匹配除@和#以外的任何字符,重复1次或更多次
  • \]匹配右括号(符号需要转义)