我在尝试编写 PHP Regex 匹配模式来匹配字符串并将其拆分为所需的组时遇到问题。
情况是这样的……我有多个联系人字符串:
+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
这会给我:
第 1 组: +35 00000000,info@company1.com,www.company1.com
第 2 组: +36 00000000,info@company2.com,www.company2.com
如您所见,这些字符串可以不同。我需要做的是将这些字符串拆分为联系人组,其中:
- 通常以电话号码 (+) 开头,但并非总是如此并且只能包含一个
- 如果没有提供电话,可以从网站链接或电子邮件开始
- 可以包含多个不同公司的组
所以一开始我尝试匹配以电话号码开头并以网站结尾的组:
((\+?[\d ]+)?(, )?(.*)(, )?(www\.\w+\.\w{2,})?)
但这并不完全匹配。然后还尝试简化所有以电话号码开头的 Ant 匹配组:
(\+[\d ]+).*
但这匹配完整的字符串。
不得不说我是 Regex 的大菜鸟。我设法进行基本匹配,但这对我来说太难了。
模式的长度或低性能并不重要,因为这将是一次性执行。
最佳答案
您可以使用以下方式获得与预期组的匹配
(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*)?(\S+@\S+)\b)?(?:(?:,\s*)?(www\.\S+)\b)?
参见 regex demo .
请注意,(?=[^\s,])
前瞻用于避免匹配空字符串。
详细信息:
(?=[^\s,])
- 下一个字符必须是逗号和空格以外的字符(\+?\d(?:[\d\s]*\d)?)?
- 一个可选的第 1 组:一个可选的+
,一个数字,然后是可选的零个或多个数字和空格,然后是数字(?:(?:,\s*)?(\S+@\S+)\b)?
- 可选出现(?:,\s*)?
- 可选的逗号和零个或多个空格(\S+@\S+)\b
- 第 2 组:一个或多个非空白,@
,一个或多个非空白,一个单词边界
(?:(?:,\s*)?(www\.\S+)\b)?
- 可选出现(?:,\s*)?
- 可选的逗号和零个或多个空格(www\.\S+)\b
- 第 3 组:www.
,一个或多个非空白,单词边界。
关于php - 正则表达式匹配联系人组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69085829/