在包含大量以下网址标记的字符串中 -
[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.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?\]", "gi");
但是我仍然不清楚如何在单程中做到这一点。我是否必须循环才能找到匹配器?
答案 0 :(得分:1)
目前我找到了网址格式的正则表达式
但它的目的是成为一个正则表达式文字,而不是RegExp
构造函数的字符串参数。所有反斜杠都会对以下字符进行字符串转义,并且在正则表达式中没有任何效果。相反,使用
/\[(http|ftp|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?\]/gi
但是我仍然不清楚如何在单程中做到这一点。我是否必须循环才能找到匹配器?
不,一个简单的replace
call就足够了。您可以在网址周围放置capturing group(方括号之间),然后使用替换字符串中的捕获:
var regex = /\[((?:ftp|http)s?:\/\/[\w-]+(?:\.[\w-]+)+(?:[\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)\]/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)
我们假设:
然后这个简单的正则表达式将起到作用:
\[[^@#]+\]
\[
匹配一个左括号(符号需要转义)[^@#]+
匹配除@和#以外的任何字符,重复1次或更多次\]
匹配右括号(符号需要转义)