php - 正则表达式匹配联系人组

标签 php regex regex-group

我在尝试编写 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/

相关文章:

PHP脚本错误

php - 无法在 Laravel 8 : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known 中运行迁移

ruby - 正则表达式在 Rails Ruby 的字符串中查找键?

c# - 在 Linq 语句中使用 "Match"

python - python 正则表达式中的可选组

python - 将一个字典中的值与另一个字典中的键链接起来,并使用正则表达式在字符串中将一个替换为另一个

php - 为什么 javascript 不接受我的 JSON 数组?

php - 获取图像尺寸

java - java中连续重复字符的替换

php - preg_replace单个变量中的多个Youtube链接