使用php和regex检查文本是否包含网址,电子邮件和电话号码

时间:2017-08-11 10:18:17

标签: php regex preg-match

我有一个文本,例如:
$ descrizione ="电话+ 39.1234.567899 asd.test@testwebsite.com www.testwebsite.com "
我希望得到三个不同的变量:
" + 39.1234.567899"
" asd.test@testwebsite.com"
" www.testwebsite.com
&#34 ;.
要检查文本是否包含电子邮件,我使用正则表达式并编写此代码:

$regex = '/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/';
if (preg_match($regex, $descrizione, $email_is)) {
     for($e = 0; $e < count($email_is) ; $e++){
          if(strpos($email_is[$e], "@") !== false){
               $linkEmail = $email_is[$e];
          }
     }
} 

现在,我想找到网站网址,所以我试着写:

$regex = '/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi';
if( preg_match($regex, $descrizione, $matches)){
     $linkWebsite = $matches[0];
}

但是preg_match返回false。我使用网站http://regexr.com/控制正则表达式并且它是正确的,所以我不明白为什么返回总是错误的。问题出在哪里?
我尝试使用"/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/"但我遇到了同样的问题,我尝试用trycatch检查错误,但它没有返回错误。

最后我想找一个电话号码,但我不知道怎么写正则表达式 请问有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

你的正则表达式失败了,因为它有问题。您已使用斜杠转义斜杠(/)。你应该使用反斜杠:

[-a-zA-Z0-9@:%_\+.~#?&\/=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&\/=]*)?

Here at regex101

由于regexr使用JS正则表达式,它不会抱怨,但如果你在regex101上尝试选择php,你就可以轻松检测到这些错误。

关于电话号码的正则表达式 - 搜索! E.g https://stackoverflow.com/search?q=%5Bregex%5D+phone+number

答案 1 :(得分:0)

我找到了解决办法,我希望这可以帮助某人 preg_match 会返回仅第一个结果,而不是它找到的所有结果。
因此,如果我使用像regex101这样的网站检查正则表达式,它会返回所有匹配的更正结果,但如果我在php中使用相同的正则表达式,它只返回一个。
正则表达式选项&#34; g&#34; (全局=首次匹配后不返回)对应于 preg_match_all 功能