从字符串中获取电子邮件 - 正则表达式语法 + preg_match_all [关闭]
Posted
技术标签:
【中文标题】从字符串中获取电子邮件 - 正则表达式语法 + preg_match_all [关闭]【英文标题】:getting emails out of string - regex syntax + preg_match_all [closed] 【发布时间】:2013-02-09 15:34:34 【问题描述】:我正在尝试从字符串中获取电子邮件:
$string = "bla bla pickachu@domain.com MIME-Version: balbasur@domain.com bla bla bla";
$matches = array();
$pattern = '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b';
preg_match_all($pattern,$string,$matches);
print_r($matches);
我得到的错误是:
分隔符不能是字母数字或反斜杠
我从这里http://www.regular-expressions.info/email.html得到了正则表达式语法
【问题讨论】:
在最后一个 b 之后添加 /i 或 / (即在模式中) How to validate an email address in php的可能重复 【参考方案1】:像这样
$pattern = '/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b/i';
或者更小的版本:)
$pattern = '/[a-z\d._%+-]+@[a-z\d.-]+\.[a-z]2,4\b/i';
【讨论】:
@MorSela 是的,首先您需要在模式的开头和结尾添加分隔符 //。需要后必须添加“i”修饰符以不区分大小写。就这样。 :) @MorSela 谢谢 :) @j5Dev 我也使用 regex builde,这个:regexbuddy.com 非常酷的工具 :) @MorSela 不要介意 :) 你能说明你是如何在函数中使用这种模式的吗(preg_match
或preg_match_all
)
@MorSela 我已经更正了,你的正则表达式模式 #[az\d!\#$%&'*+/=?^_|~-]+(?:\.[a-z\d!\#$%&'*+/=?^_
|~-] +)*@(?:[az\d](?:[az\d-]*[az\d])?\.)+[az\d](?:[az\d-]*[az \d])?# 有一个警告,例如正则表达式模式/here your pattern/
,这里你使用/
模式分隔符,因此在你的模式中你必须转义每个/
字符。此外,例如,如果您使用 #
作为模式分隔符,则必须转义模式中的每个 #
字符等...【参考方案2】:
使用 PCRE 正则表达式函数时,需要用分隔符将模式括起来:
PHP Delimiters
常用的分隔符是正斜杠 (/)、井号 (#) 和 波浪号 (~)。以下是有效分隔的所有示例 模式。
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%
那么您必须将此行更正为:
$pattern = '/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b/';
或
$pattern = '#\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b#';
【讨论】:
我之前试过,$matches 是空的.. 它关于你的模式......改变它的玩法...... @homerrrrrrrr 除了添加适当的分隔符,您还需要添加正则表达式i
标志,因此电子邮件搜索不区分大小写。匹配结果为空,因为它使用区分大小写的搜索。你得到的错误是因为模式没有正确地包含在分隔符中。上面的答案确实解决了关于错误消息的问题。如果您想知道为什么没有匹配项,则需要问一个单独的第二个问题。【参考方案3】:
您只需将模式包装在适当的分隔符中,例如正斜杠。像这样:
$pattern = '/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4\b/';
【讨论】:
我之前试过,$matches 是空的.. 在这种情况下,您的正则表达式需要调整。语法错误通过正确分隔来修复;构建一个有效的正则表达式是完全不同的事情:)以上是关于从字符串中获取电子邮件 - 正则表达式语法 + preg_match_all [关闭]的主要内容,如果未能解决你的问题,请参考以下文章