我在尝试编写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
这会给我:
组1:+35 00000000,info@company1.com,www.company1.com
组2:+36 00000000,info@company2.com,www.company2.com
正如您所看到的,这些字符串可能是不同的。我需要做的是将这些字符串分成联系人组,其中:
- 通常以电话号码(+)开头,但并非总是如此,可以只包含一个
- 如果未提供电话,则可以以网站链接或电子邮件开始
- 可以包含多个不同公司的组
因此,首先尝试匹配以电话号码开头并以网站结尾的组:
((\+?[\d ]+)?(, )?(.*)(, )?(www\.\w+\.\w{2,})?)
但这并不完全匹配。然后尝试简化所有内容并匹配以电话号码开头的组:
(\+[\d ]+).*
但这只匹配完整的字符串。
必须说我在正则表达式方面是个大菜鸟。我能做基本的匹配,但这对我来说太难了。
模式的长度或低性能并不重要,因为这将是一次性执行。
,
拆分字符串,然后扫描分隔的字段呢?如果可以不使用正则表达式解决问题,那么就不要使用它。 - Daniel W.(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*|^)(\S+@\S+)\b)?(?:(?:,\s*|^)(www\.\S+)\b)?
,请参见demo。或者,使用(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*)?(\S+@\S+)\b)?(?:(?:,\s*)?(www\.\S+)\b)?
(demo) - Wiktor Stribiżew