2017-02-23 91 views
0

我想是的后面是一个关键的词“电子邮件”正则表达式查找后面

preg_match_all("/(email<=)(\[email protected]\S+)/im", $input_lines, $output_array);

我输入的数据是文本中找到邮件关键字的电子邮件地址

here is some text 
that does not [email protected] 
but this email should be captured [email protected] 

所以在第3行的电子邮件应该捕获

+1

你在找什么关键字? - 你的问题没有明显的原因,为什么第3行会匹配,但第2行不会。 – Theo

+0

“电子邮件”一词应该位于同一行的电子邮件地址前面。更新的问题 – Kal

回答

2

正则表达式:/email.+?\b(\[email protected]\S+)/i

Working Example

在PHP中:

preg_match_all("/email.+?\b(\[email protected]\S+)/i", $input_lines, $output_array); 

$output_array[1]现在将包含您的电子邮件地址

我删除了m标志 - 因为这改变了方式,也没有使用$^工作。

这样做的明细如下:

  • email这只是文本email匹配 - 最后/后,我使得它不会在乎情况
  • .+?结果会比新行以外的任何字符一次或多次,但匹配尽可能少的字符见Regex Laziness
  • \b将匹配单词边界 - 即在单词字符和非单词字符之间 - 请参阅Word boundaries
  • (开始捕获组 - 因为这是第一位的,这就是为什么它在$output_array[1]被发现,如果你有一个第二任何匹配将是$output_array[2]
    • \S+匹配任何不是空白一次或多次
    • @相匹配的“@”字符
    • \S+匹配任何不是空白字符一次或多次
  • )这一关捕获组

我们可以在\[email protected]\S是否是匹配的电子邮件地址的最佳方式启动一个巨大的辩论 - 我觉得够了,给这个目的,但如果你想下去兔子hole see here:Using a regular expression to validate an email address

+0

输出只显示'@ well.com' – Kal

+0

是的抱歉,我现在已经更正 - 我将进一步编辑并解释这是如何工作的 – Theo

+1

@Theo很好的答案。我以前从未使用\ b,现在我知道如何使用它。我访问了你的工作演示链接,并用'\ s'替换了'\ b',它产生了相同的结果,但'\ s'在53步中完成了这个操作,'\ b'使用了86个步骤。这不是批评,只是一种观察。对于这个小样本,时间/步长的影响是不明显的,但如果Kal正在做一个巨大的弦,那么这个纳米优化可能会受到重视。只是想提到它。 – mickmackusa