【问题标题】:getting emails out of string - regex syntax + preg_match_all [closed]从字符串中获取电子邮件 - 正则表达式语法 + preg_match_all [关闭]
【发布时间】: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得到了正则表达式语法

【问题讨论】:

标签: php regex preg-match preg-match-all


【解决方案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_matchpreg_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 是空的..
  • 在这种情况下,您的正则表达式需要调整。语法错误通过正确分隔来修复;构建一个有效的正则表达式是完全不同的事情:)
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 2011-09-10
  • 2011-08-20
  • 2015-08-04
  • 2020-05-13
  • 2011-07-01
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多