如何使用正则表达式的多个返回值?

时间:2014-06-17 15:54:29

标签: javascript jquery regex html5 dom

我正在使用正则表达式查找来自Google日历XML Feed的链接,该链接显示在表单中:

<a href="http://www.drsketchysdublin.com/event-registration/?ee=11">http://www.drsketchysdublin.com/event-registration/?ee=11</a>

我想用

替换它
<a href="http://www.drsketchysdublin.com/event-registration/?ee=11">drsketchysdublin</a>

我正在使用以下正则表达式匹配文本:

 expression = //(<a\shref="https?[^>]+>(https?:\/\/www\.([^\.]+)\.com[^<]+)<\/a>)/ig;

然后使用

进行替换
return element.html( element.text().replace(expression, "<a href='$1' target='"+options.target+"'>$2</a>") );

我希望$ 1为

的值
(https?:\/\/www\.([^\.]+)\.com[^<]+)<\/a>)

和$ 2是

的值
([^\.]+)

我正在使用此处的代码http://gabrielizaias.com/articles/jquery-urltolink-plugin/

如何从正则表达式引用两个返回的值?我尝试过像[0]这样的东西,但没有运气。

1 个答案:

答案 0 :(得分:0)

您可以使用函数作为替换的第二个参数。此函数允许表达式中的参数。参数是(完全匹配,[捕获项目],匹配偏移,原始字符串)。您可以在此功能中拥有多个捕获项。一个简单的例子:

var testItem = 'test1@test2';
var expression = new RegExp(/^([^@]+)@([^@]+)$/)
var returnItem = testItem.replace(expression, function(full_match, $1, $2, offset, original){
    console.log('full match: '+full_match)
    console.log('$1: '+$1)
    console.log('$2: '+$2)
    console.log('offet: '+offset)
    console.log('original: '+original)
    return (typeof $1 != "undefined" && typeof $2 != "undefined") ? $1+','+$2 : false; 
});
if (returnItem !== false) console.log(returnItem.split(','))
else console.log('bad return value');

该片段声明了一个简单的字符串,一个表达式,用于抓取@符号两侧的项目,然后使用replace函数在解析后返回两个匹配的项目。控制台登录返回功能是为了演示每个变量所持有的内容。运行上面的代码后,我收到了以下输出:

full match: test1@test2
$1: test1
$2: test2
offet: 0
original: test1@test2
["test1", "test2"] 

您可以使用此方法通过一个小修改来解析正则表达式的返回值。 我的示例代码有一个问题:我的返回是使用逗号分割来创建数组。如果您的内容中包含逗号,则无效。

这对您来说不是问题,您可以使用以下内容:

var temp = '<a href="http://www.drsketchysdublin.com/event-registration/?ee=11">http://www.drsketchysdublin.com/event-registration/?ee=11</a>'
var expression = /<a\shref="https?[^>]+>(https?:\/\/www\.([^\.]+)\.com[^<]+)<\/a>/ig;
var options = {target : 'blank'}

console.log(temp.replace(expression, function(full_match, $1, $2, offset, original){ return '<a href="'+$1+'" target="'+options.target+'">'+$2+'</a>';}))

稍微更改一下变量(并将控制台日志更改为返回程序),你应该没问题。 请注意,我从你的正则表达式中删除了一组括号,它们似乎没有被用于任何东西,所以我放弃了它们。如果您对使正则表达式更加通用有任何疑问,请告诉我。