正则表达式只匹配电话号码,而不是日期

时间:2018-01-05 12:39:20

标签: php regex

我的正则表达式: https://regex101.com/r/wM0oy1/2/

/(((?!(([1-9]|0[1-9]|[12][0-9]|3[01])\.([1-9]|0[1-9]|1[012])\.(19|20)\d\d)))
(\+?[0-9][0-9()-s+\s]{5,20}[0-9]))/

我只想要它匹配电话号码,但是atm我不能让它工作,这是我认为会起作用但我只得到1场比赛

测试22.13.2018< - 不希望日期匹配

测试09234343< - 希望在电话号码上匹配

测试0171 443 343 433< - 希望在电话号码上匹配

测试0943 34445< - 希望在电话号码上匹配

测试+49(0)94234 3434 34< - 希望在电话号码上匹配

测试09743/1443< - 不匹配电话号码

测试02.12.2017< - 不希望日期匹配

2017年测试< - 不希望日期匹配

我基本上想排除日期。

我希望这只匹配phonenumbers而不是日期

\+?[0-9][0-9()-s+\s]{5,20}[0-9]

并接受此模式作为例外

(0[1-9]|[12][0-9]|3[01])\.(0[1-9]|1[012])\.(19|20)\d\d

2 个答案:

答案 0 :(得分:1)

使用跳过失败:

(?:0?[1-9]|[12][0-9]|3[01])\.(?:0?[1-9]|1[012])\.(?:19|20)\d\d(*SKIP)(*F)|\+?[0-9][0-9()-s+\s]{5,20}[0-9]

请参见proof

一旦(?:0?[1-9]|[12][0-9]|3[01])\.(?:0?[1-9]|1[012])\.(?:19|20)\d\d被匹配,SKIP-FAIL运算符将省略匹配,而\+?[0-9][0-9()-s+\s]{5,20}[0-9]将永远不会匹配日期子字符串。

答案 1 :(得分:0)

您可以在php中使用内置函数checkdate并检查它是否是有效日期。