[英]Regex for multiple email address replacements
好,這是我的情況。 我有一個由WordPress運行的網站。 我需要確保電子郵件混淆,因此已經安裝了名為“優美的電子郵件混淆”的插件。 這已經很好了。 要注意的是,如果有人不遵循它指定的輸入電子郵件地址的規則(即[email] test@example.com [/email]
),我想要一個[email] test@example.com [/email]
。
以下正則表達式非常適合抓取所有電子郵件,但我不希望它接觸正確寫為[email]test@example.com[/email]
。 我需要添加什么?
// Match any a href="mailto: AND make it optional
$monster_regex = '`(\<a([^>]+)href\=\"mailto\:)?';
// Match any email address
$monster_regex .= '([^0-9:\\r\\n][A-Z0-9_]+([.][A-Z0-9_]+)*[@][A-Z0-9_]+([.][A-Z0-9_]+)*[.][A-Z]{2,4})';
// Now include all its attributes AND make it optional
$monster_regex .= '(\"*\>)?';
// Match any information enclosed in the <a> tag AND make it optional
$monster_regex .= '(.*)?';
// Match the closing </a> tag AND make it optional
$monster_regex .= '(\<\/a\>)?`';
$monster_regex .= 'im'; // Set the modifiers
preg_match_all($monster_regex, $content, $matches, PREG_SET_ORDER);
我的測試輸入是這樣的:
<a href = "test@example.com">Tester</a>
test@example.com
<a href = "test@hotmail.com">Hotmail Test</a>
[email]test@example.com]
我得到的輸出是這樣的:
(
[0] => Array
(
[0] => <a href="mailto:test@example.com">Tester</a>
[1] => <a href="mailto:
[2] =>
[3] => test@example.com
[4] =>
[5] =>
[6] => ">
[7] => Tester</a>
)
[1] => Array
(
[0] => test@example.com
[1] =>
[2] =>
[3] => test@example.com
[4] =>
[5] =>
[6] =>
[7] =>
)
[2] => Array
(
[0] => <a href="mailto:test@hotmail.com">Hotmail Test</a>
[1] => <a href="mailto:
[2] =>
[3] => test@hotmail.com
[4] =>
[5] =>
[6] => ">
[7] => Hotmail Test</a>
)
[3] => Array
(
[0] => [email]test@example.com[/email]
[1] =>
[2] =>
[3] => [email]test@example.com
[4] =>
[5] =>
[6] =>
[7] => [/email]
)
)
提前致謝。
因此,您想匹配看起來像電子郵件地址的任何內容,除非[email]...[/email]
標記中已經包含了該地址? 嘗試這個:
'%(?>\b[A-Z0-9_]+(?:\.[A-Z0-9_]+)*@[A-Z0-9_]+(?:\.[A-Z0-9_]+)*\.[A-Z]{2,4}\b)(?!\s*\[/email\])%i'
注意:此答案僅解決如何匹配未包含較大結構的對象的問題。 我不打算就如何(或是否)將電子郵件地址與正則表達式進行匹配進行辯論。 我只是從問題中提取了核心正則表達式,並用單詞邊界 ( \\b
)將其括起來,然后將其包裝在一個原子組 ( (?>...)
)中。
一旦找到潛在的匹配項, 否定的前瞻斷言該地址后面沒有結束的[/email]
標記。 假設標簽已正確配對,則意味着地址已正確標簽。 如果未正確配對,則插件的工作就是抓住它。
當我在這里時,我想對您的正則表達式發表一些評論:
范圍表達式Az
出現在您的某些字符類中。 可能只是拼寫錯誤,但有些人將其用作匹配大寫或小寫字母的慣用法。 這是一個錯誤,因為它還匹配了幾個標點符號,它們的代碼點恰好位於兩個字母范圍之間。 (我在編輯問題時已解決該問題。)
字符<
, >
, :
, "
, @
, =
和/
在正則表達式中沒有特殊含義,不需要轉義。它不會造成任何損害,但是正則表達式已經足夠難以閱讀;為什么要大量使用不需要的反斜杠和方括號?
(.*)?
問號(.*)?
屬於括號內的(.*?)
這樣,它將不情願地匹配下一個</a>
之前的所有內容。 如果沒有匹配項,它將完全不匹配。 使其成為可選不僅是多余的,而且可能導致嚴重的性能損失 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.