我在编写PHP匹配模式以匹配字符串并将字符串拆分为需要的组时遇到了问题。
情况就是这样..。我有一个包含联系人的多个字符串:
+35 00000000, info@company.com, www.company.com
这会让我:
1组: +35 00000000,info@company.com,www.company.com
+35 00000000, +360000000, info@company.com, www.company.com
这会让我:
集团1: +35 00000000
2组: +36 00000000,info@company.com,www.company.com
info@company.com, www.company.com
这会让我:
集团1: info@company.com,www.company.com
+35 00000000, info@company1.com, www.company1.com, +36 00000000, info@company2.com, www.company2.com
这会让我:
Group 1: +35 00000000,info@company1.com,www.company1.com
集团2: +36 00000000,info@company2.com,www.company2.com
正如您所看到的,这些字符串可能是不同的。我需要做的是将这些字符串分成几组联系人,如下所示:
所以一开始,我试着用电话号码和网站进行配对:
((\+?[\d ]+)?(, )?(.*)(, )?(www\.\w+\.\w{2,})?)但这并不完全符合。此外,还试图简化以电话号码开头的所有蚂蚁匹配组:
(\+[\d ]+).*但这匹配完整的字符串。
不得不说我是个大人物。我设法完成了基本的比赛,但这对我来说太难了。
模式的长度或低性能并不重要,因为这将是一次执行。
发布于 2021-09-07 09:56:37
您可以使用以下方法获得具有预期组的匹配。
(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*)?(\S+@\S+)\b)?(?:(?:,\s*)?(www\.\S+)\b)?见regex演示。
注意,(?=[^\s,])查找是用来避免匹配空字符串的。
详细信息
(?=[^\s,]) -下一个字符必须是逗号和空格以外的字符(\+?\d(?:[\d\s]*\d)?)? -可选组1:一个可选的+,一个数字,然后是一个可选的零或多个数字和空白空间,然后是一个数字(?:(?:,\s*)?(\S+@\S+)\b)? -可选的出现(?:,\s*)? -逗号和零或多个空格的可选出现(\S+@\S+)\b - Group 2:一个或多个非空白空间,@,一个或多个非空白空间,一个单词边界。(?:(?:,\s*)?(www\.\S+)\b)? -可选的出现(?:,\s*)? -逗号和零或多个空格的可选出现(www\.\S+)\b -第3组:www.,一个或多个非空白空间,字界.发布于 2021-09-07 09:54:12
您可以使用以下方法获得匹配:
(?:\+?\d+(?:\h+\d+)*,\h*)?[^\s@]+@[^\s@,]+,\h*www\.\S+|\+?\d+(?:\h+\d+)*模式匹配:
(?:\+?\d+(?:\h+\d+)*,\h*)?匹配一个可选的+,然后用可选的空格匹配数字[^\s@]+@[^\s@,]+匹配类似于电子邮件的模式,只匹配单个@,\h*www\.\S+匹配一个,,然后是www.和1+非空格字符|或\+?\d+\h*\d+匹配电话号码类似的模式或者使用交替的|为url和电子邮件地址匹配这两种方式。
(?:\+?\d+(?:\h+\d+)*,\h*)?(?:[^\s@]+@[^\s@,]+,\h*www\.\S+|\h*www\.\S+,\h*[^\s@]+@[^\s@,]+)|\+?\d+(?:\h+\d+)*https://stackoverflow.com/questions/69085829
复制相似问题