簡體   English   中英

正則表達式用於多個電子郵件地址替換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM