我有这段代码检查电子邮件是否有效:
$email = "abc123@sdsd.com";
$regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';
if (preg_match($regex, $email)) {
echo $email . " is a valid email. We can accept it.";
} else {
echo $email . " is an invalid email. Please try again.";
}
假设我在下面有以下字符串:
<html>
<body>
<p>abc123@sdsd.com</p>
</body>
</html>
我如何检查该字符串是否有电子邮件? (因为它不适用于上面的代码)
答案 0 :(得分:4)
^
和$
是锚点,需要完整的字符串匹配。如果你取消它,它将匹配字符串中某处的电子邮件。
正则表达式演示:https://regex101.com/r/xI0bC2/1
PHP使用(已更新以存储找到的电子邮件):
<?php
$email = "<html>
<body>
<p>abc123@sdsd.com</p>
</body>
</html>";
$regex = '/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/';
if (preg_match($regex, $email, $email_is)) {
echo $email_is[0] . " is a valid email. We can accept it.";
} else {
echo $email . " is an invalid email. Please try again.";
}
PHP演示:https://eval.in/618679
答案 1 :(得分:2)
这个问题没有真正的解决办法,因为你很容易获得误报。
首先,您的模式太天真,并且与许多正确的电子邮件地址不匹配。但是,匹配所有电子邮件地址的模式并不存在(或过于复杂且效率低下)。
折衷方案是使用XPath选择包含@
的所有文本节点。然后将每个文本节点拆分为空白区域,并使用内置电子邮件验证PHP函数测试每个部分:filter_var ($part, FILTER_VALIDATE_EMAIL)