【问题标题】:Regex search Telefon but skip urls正则表达式搜索 Telefon 但跳过网址
【发布时间】:2020-05-13 16:54:31
【问题描述】:

我有一个正则表达式,可以完美地处理我想要获取的数字,但问题在于也获取它们的 URL,我该如何删除它们?

如果没有空格、换行之类的就跳过?

谢谢!!

我当前的正则表达式是:

/((?(0{1,2}|+)\d{1,2})?)?(([ -]*\d+){8,20})+/gm

https://regex101.com/r/yzAScj/1

我所做的修改不起作用:

/\s{1}((?(0{1,2}|+)\d{1,2})?)?(([ -]*\d+){8,20})+\ s{0,1}/gm

https://regex101.com/r/yzAScj/2

测试文本:

https://asd.com/20441235534-aaaaaaaaaaa-

202460676

aasdasd 202460676

https://asd.com/20441235534


202460676-



10 text
1234 text
text 123

00491234567890
+491234567890

0123-4567890

0123 4567 789
0123 456 7890
0123 45 67 789

+490123 4567 789
+490123 456 7890
+49 123 45 67 789

123 4567 789
123 456 7890
123 45 67 789


+49 1234567890
+491234567890

0049 1234567890
0049 1234 567 890

(0049)1234567890
(+49)1234567890

(0049) 1234567890
(+49) 1234567890



text text (0049) 1234567890 text text
text text (+49) 1234567890 text text

使电话号码具有链接“电话:”以便能够点击它们。

您不应选择 URL 作为电话号码。

JS代码(带jquery):

函数 searchAndReplacePhones(){

    var regex =  /(\(?(0{1,2}|\+)\d{1,2}\)?)?(([ -]*\d+){8,20})+/gm;

    //Beschreibung
    $(".my_text").html($(".my_text").html().replace(regex, " <a href=\"tel:$&\">$&</a> "));

}

【问题讨论】:

  • 你的正则表达式风格是什么? regexp-replace 暗示了 Oracle,但您可能已经使用过它,因为您计划在某些替换方法中使用正则表达式。哪一个?
  • 我用 JS 和 Jquery 替换
  • 我也相信你原来的正则表达式(\(?(0{1,2}|\+)\d{1,2}\)?)?(([ -]*\d+){8,20})+有点不对劲,你想匹配包含8到20位数字的电话号码,对吧?您将 \d 量化为 +,现在您匹配 8 到 20 个以空格或连字符分隔的 1+ 数字块,这可能太多了。
  • 你实际上在做什么?用一些标签包装数字?
  • 它使电话号码具有链接“tel:”以便能够点击它们,但它不应将 URL 作为电话。我刚刚编辑了帖子。谢谢!

标签: regex regexp-replace


【解决方案1】:

您可以使用匹配 URL(例如,https?://\S*)或匹配并捕获电话号码的正则表达式:

var regex = /https?:\/\/\S*|((?:\(?(?:0{1,2}|\+)\d{1,2}\)?[ -]*)?\d(?:[ -]*\d){7,19})/gi;

那么,当你在.replace方法中使用时,需要使用回调方法,在这里传递正则匹配并分析匹配的结构:如果Group 1匹配,则替换它,否则,放回匹配值。

查看regex demo 和下面的 JS 演示:

var text = "\n\nhttps://asd.com/20441235534-aaaaaaaaaaa-\n\n202460676\n\naasdasd 202460676\n\nhttps://asd.com/20441235534\n\n\n202460676-\n\n\n\n10 text\n1234 text\ntext 123\n\n00491234567890\n+491234567890\n\n0123-4567890\n\n0123 4567 789\n0123 456 7890\n0123 45 67 789\n\n+490123 4567 789\n+490123 456 7890\n+49 123 45 67 789\n\n123 4567 789\n123 456 7890\n123 45 67 789\n\n\n+49 1234567890\n+491234567890\n\n0049 1234567890\n0049 1234 567 890\n\n(0049)1234567890\n(+49)1234567890\n\n(0049) 1234567890\n(+49) 1234567890\n\n\n\ntext text (0049) 1234567890 text text\ntext text (+49) 1234567890 text text";
var regex = /https?:\/\/\S*|((?:\(?(?:0{1,2}|\+)\d{1,2}\)?[ -]*)?\d(?:[ -]*\d){7,19})/gi;
//https://regex101.com/r/0LxWTv/5
document.body.innerHTML = "<pre>" + text.replace(regex, function($0,$1) {
  return $1 ? '<a href="tel:' + $1 + '">' + $1 + '</a>' : $0;
} ) + "</pre>";

注意我稍微修改了模式:

  • (?:\(?(?:0{1,2}|\+)\d{1,2}\)?[ -]*)? - 一个可选的非捕获组,匹配 1 次或 0 次
    • \(?
    • (?:0{1,2}|\+) - 一个或两个零或+
    • \d{1,2} - 一位或两位数
    • \)? - 一个可选的)
    • [ -]* - 0 个或多个空格或连字符
  • \d - 一个数字
  • (?:[ -]*\d){7,19} - 七到十九位数字,用 0 个或多个空格或连字符分隔。

【讨论】:

  • 你说得对,我用的是我的旧代码,效果很好,非常感谢!!
【解决方案2】:

PHP regex, skip <link> tags when rel="canonical" 展示了(*SKIP)(*F) 技巧的使用,将https?:\/\/\S*(*SKIP)(*F)| 添加到您的表达式中:

https?:\/\/\S*(*SKIP)(*F)|(\(?(0{1,2}|\+)\d{1,2}\)?)?(([ -]*\d+){8,20})+

proof

使用https?:\/\/\S*(*SKIP)(*F)|,您可以跳过网址,匹配其他任何位置。

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多