Chrome 正则表达式-匹配编码的tel URL中的“%20”

gkn4icbw  于 11个月前  发布在  Go
关注(0)|答案(2)|浏览(121)

我有以下regex:

(?:[\s:]|\d+(?:-|.)|^)(?(\d{3}))?[- .]?(\d{3})[- .]?(\d{4})(?=<|\s|$)

字符串

在复制正则表达式时,看起来有些转义反斜杠丢失了,所以这里是正确的正则表达式:(?:[\s:]|\d+(?:-|.)|^)\(?(\d{3})\)?[- .]?(\d{3})[- .]?(\d{4})(?=<|\s| $)

它用于Chrome上的Tel Linker扩展,以正确格式化网页上的电话号码链接。
但是,当URL中的空格用'%20'编码时,它无法正确格式化tel链接:例如:

https://someresource.com/tel:(904)%20640-8301
https://someresource.com/tel:(904)%20640%208301


不幸的是,我没有使用Regex的经验,所以任何帮助/建议都非常感谢。

qrjkbowd

qrjkbowd1#

正如@mplungjan指出的,你的正则表达式是无效的。
试试这个:

(?:[\s:]|\d+(?:-|.)|^)\(?(\d{3})\)?(?:%20)*(?:[- .]+(?:%20)*)?(\d{3})(?:(?:%20)*[- .]*(?:%20)*)?(\d{4})(?=<|\s|$)

字符串
如果你把它作为一个字符串使用,你需要对每个\进行转义:

(?:[\\s:]|\\d+(?:-|.)|^)\\(?(\\d{3})\\)?(?:%20)*(?:[- .]+(?:%20)*)?(\\d{3})(?:(?:%20)*[- .]*(?:%20)*)?(\\d{4})(?=<|\\s|$)


Tested against

https://someresource.com/tel:(904)640-8301
https://someresource.com/tel:(904)%20640%208301
https://someresource.com/tel:(904)%20640-8301
https://someresource.com/tel:(904)%20640 - 8301
https://someresource.com/tel:(904)%20640%20-%208301

  • 感谢@Casimir et Hippolyte的建议 *
cbjzeqam

cbjzeqam2#

根据regex101,您提供的regex无效

(?:[\s:]|\d+(?:-|.)|^)(?(\d{3}))?[- .]?(\d{3})[- .]?(\d{4})(?=<|\s|$)

字符串
如果捕获组中没有?,它是有效的,并且似乎匹配正确的东西:

(?:[\s:]|\d+(?:-|.)|^)((\d{3}))?[- .]?(\d{3})[- .]?(\d{4})(?=<|\s|$)


[- .]负责匹配tel中的空格,因此将其替换为也匹配%20的正则表达式将解决:(?:[- .]|%20)

(?:[\s:]|\d+(?:-|.)|^)((\d{3}))?(?:[- .]|%20)?(\d{3})(?:[- .]|%20)?(\d{4})(?=<|\s|$)

相关问题