2

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

[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 都将被搜索并替换为元素的内联 url。目前我发现 URL 模式的正则表达式为 -

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

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

4

4 回答 4

1

当前我找到了 URL 模式的正则表达式

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

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

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

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

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

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

于 2013-06-18T23:00:55.317 回答
0

Let's suppose that:

  • no recursive [[]]
  • no empty []
  • the url never contains bracket, at sign nor sharp
  • nothing else than [url], [@ID342892904], [#sometag] contains bracket

Then this simple regex will do the trick:

\[[^@#]+\]
  • \[ matches an opening bracket (symbol needs to be escaped)
  • [^@#]+ matches any character except @ and #, repeated 1 or more times
  • \] matches a closing bracket (symbol needs to be escaped)
于 2013-06-18T22:39:32.460 回答
0

I would write a helper function that takes a single url string as input and return the anchor tag with that url on match. Parse the big string into an array with each element matching a corresponding [] pair. Then it's just a matter of iterating over this array and passing it into the helper function:

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 will contain:

[ '<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>' ]
于 2013-06-18T22:09:53.163 回答
0

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

JTexy项目(类似于 MarkDown,但更好)有很多用于各种任务的正则表达式,包括 URL 匹配

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

$TEXY_CHAR在项目的某处定义。

顺便说一句,使用括号括住 URL 并不是一个好主意,例如 PHP[...]用于初始化散列,通常用于复选框。

于 2013-06-18T22:15:18.887 回答