2017-02-23 52 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