PHP正则表达式匹配特定格式邮箱字符串的问题求助
PHP正则表达式匹配特定格式邮箱字符串的问题求助
嘿,我来帮你捋捋这个问题!你想要精准抓取"email":"email@domain.com"这种格式绑定的邮箱,但当前的正则表达式跑偏了,会抓到其他不相关的邮箱,对吧?
先说说你原来的正则哪里出问题了:["email":"]+这个部分的逻辑是匹配任意数量(至少1个)的双引号、e、m、a、i、l、冒号这些字符的任意组合,而不是精确匹配"email":"这个固定前缀。举个例子,它甚至会匹配"e:mail"这种混乱的字符串,这肯定不是你想要的结果。
那该怎么调整呢?我们需要先精准锁定"email":"这个前缀,再匹配标准的邮箱格式。这里给你改好的代码和正则:
function find_email_schema($str){ preg_match_all('/"email":"([\w\.-]+@[\w\.-]+\.\w+)"/i', $str, $matches); return $matches[1]; // 只返回捕获到的纯邮箱内容,而非整个匹配串 }
我拆解下这个正则的关键部分:
"email":":精确匹配你需要的固定前缀,确保只有和这个前缀绑定的邮箱才会被捕获():捕获组,专门用来提取我们真正需要的邮箱主体部分[\w\.-]+:匹配邮箱用户名,\w覆盖字母、数字、下划线,加上.和-,适配常见的用户名格式@:匹配邮箱必备的@符号[\w\.-]+:匹配域名的主体部分\.\w+:匹配域名后缀(比如.com、.org、.co.uk这类)/i:不区分大小写,邮箱本身通常大小写不敏感,这个保留没问题
举个测试场景,如果你的输入字符串是:
{"name":"John", "email":"john@example.com", "other":"jane@test.org", "email":"bob+tag@domain.co.uk"}
用这个函数会返回数组:["john@example.com", "bob+tag@domain.co.uk"],刚好是你要的和"email":"绑定的邮箱,不会误抓jane@test.org。
要是你需要支持更复杂的邮箱格式(比如带加号、特殊字符的),可以把邮箱部分的正则换成更贴合RFC标准的写法,但上面的版本已经能覆盖绝大多数常见场景啦。
备注:内容来源于stack exchange,提问作者Alex Douglas
相关产品推荐
相关产品推荐

