【问题标题】:How can I use multiple return values from a regex?如何使用正则表达式的多个返回值?
【发布时间】:2023-03-06 03:57:02
【问题描述】:

我正在使用正则表达式从 google 日历 XML 提要中查找链接,这些链接显示在以下表单中:

<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]之类的东西,但没有运气。

【问题讨论】:

  • 首先,您确定您的正则表达式匹配正确吗? (另请注意,许多回复会批评您使用正则表达式来导航 HTML,因为这是 JQuery 的选择器非常适合的任务)
  • 非常确定 - 我一直在使用 Rad Softare Regex Designer 对其进行测试。至于您的第二点,您可能是正确的,但由于我必须在某些时候使用正则表达式来提取域名,所以我想我不妨将它用于整个事情。

标签: javascript jquery regex html dom


【解决方案1】:

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

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');

sn-p 声明一个简单的字符串,一个表达式,它抓取@符号两边的项目,然后使用替换函数将两个匹配的项目解析后返回。返回函数中的控制台日志用于演示每个变量所持有的内容。运行上面的代码后,我收到以下输出:

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>';}))

只需稍微更改变量(当然也将控制台日志更改为返回),您应该没问题。 请注意,我从您的正则表达式中删除了一组括号,它们似乎没有用于任何用途,所以我删除了它们。如果您对使正则表达式更通用有任何疑问,请告诉我。

【讨论】:

  • 非常感谢您提供如此广泛的答案 - 这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
相关资源
最近更新 更多