2013-04-10 92 views
1

根據我在這裏回答的問題(Use PHP to Replace HTML with HTML),我希望能夠過濾電子郵件地址的輸出文本,並將這些文本電子郵件轉換爲「mailto」鏈接。使用PHP將電子郵件文本轉換爲鏈接

下面是可用的PHP代碼,但僅用於將某些HTML轉換爲其他HTML。我試圖做的是讓這個功能尋找一個電子郵件地址,並將其轉換爲「mailto」鏈接。無論出於何種原因,代碼不會轉換電子郵件地址。這是我的PHP:

function text_filter($string) { 
    $search = array('<p>__</p>', '/[a-zA-Z0-9._-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/'); 
    $replace = array('<hr />',  '<a href="mailto:$2">$2</a>'); 
    $processed_string = str_replace($search, $replace, $string); 
    echo $processed_string; 
} 

當我使用此功能用於輸出,這是代碼的樣子:

<?php text_filter(get_the_content()); ?> 
+0

我們知道一個函數調用的樣子,向我們展示*輸出*。 *編輯*:實際上,我可以告訴你它不會工作,因爲'str_replace()'不能識別正則表達式。使用'preg_replace()'。 – Sammitch 2013-04-10 14:49:27

回答

2
  1. str_replace()不使用正則表達式,用preg_replace()重寫。
  2. 爲第一個匹配表達式添加了分隔符。
  3. 固定從$1更換爲$2

 

function text_filter($string) { 
    $search = array('/<p>__<\/p>/', '/([a-zA-Z0-9._-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/'); 
    $replace = array('<hr />', '<a href="mailto:$1">$1</a>'); 
    $processed_string = preg_replace($search, $replace, $string); 
    echo $processed_string; 
} 
+0

完美工作!我現在有另一個問題。我正在使用一個WordPress插件來模糊電子郵件地址。我不得不禁用這個插件,以便上述功能可以工作。有沒有辦法在這個代碼中添加某種電子郵件模糊處理?非常感謝你!! – 2013-04-11 17:50:47

+0

剛發現第二個問題:如果在該頁面中已經存在mailto電子郵件地址,上述功能也將嘗試轉換該電子郵件。不幸的是,一些HTML代碼在電子郵件mailto鏈接之前被添加,例如「[email protected]?subject=Subject」>「,其中[email protected]是一個全功能/可點擊的mailto鏈接。任何想法? – 2013-04-11 18:46:50

0

不能使用str_replace做一個正則表達式替換。

您需要將操作分開。

function text_filter($string) { 
    $search = array('<p>__</p>'); 
    $replace = array('<hr />'); 
    $processed_string = str_replace($search, $replace, $string); 
$processed_string = preg_replace('/[a-zA-Z0-9._-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/','<a href="mailto:$2">$2</a>',$processed_string); 
    echo $processed_string; 
} 

參見:http://www.php.net/manual/en/function.preg-replace.php的預浸更換。

+0

謝謝你的幫助!您對preg_replace是正確的,但是,您提供的代碼不起作用。電子郵件地址完全消失。由P標籤包圍的2個下劃線被水平線替換。 Sammitch的答案完美無缺! – 2013-04-11 17:48:16

+0

很棒的聲音,沒有測試任何額定的表情,所以它可能不會工作;) – Luceos 2013-04-12 07:40:17

0
function obfuscate_email($content){ 

    $pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.'; 
    $pattern .= '[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i'; 
    $replacement = '<a href="mailto:\\1">\\1</a>'; 
    $content = preg_replace($pattern, $replacement, $content); 
    return $content; 

} 

並添加過濾器

add_filter('the_content', 'obfuscate_email'); 
+0

這很適合將電子郵件轉換爲「emailto」鏈接,但是,使用已經鏈接的電子郵件地址,這不起作用。這是輸出的HTML:'[email protected]「>[email protected]' – 2014-07-14 06:52:05

+0

這是一個屏幕截圖:http://is.gd/LblnOA – 2014-07-14 07:19:51

0

另一種方式來做到這一點,以使其將在文本現有的HTML鏈接:

function html_parse_text($text) 
{  
    $text = preg_replace("/(?<!\")(((f|ht){1}tps?:\/\/)[[email protected]:%_\+.~#?&\/\/=]+)/", 
      '<a href="\\1" target=_blank>\\1</a>', $text);  
    $text = preg_replace("/([[:space:]()[{}])(www.[[email protected]:%_\+.~#?&\/\/=]+)/", 
      '\\1<a href="http://\\2" target=_blank>\\2</a>', $text); 
    $text = preg_replace("/(?<!\")([_\.0-9a-z-][email protected]([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/", 
      '<a href="mailto:\\1" target=_blank>\\1</a>', $text); 

    return $text; 
} 
+0

與上面相同的評論...這與將電子郵件轉換爲」emailto「鏈接效果很好,但是,輸入HTML:'[email protected]「>[email protected]' – 2014-07-14 07:12:24

0

這是另一個版本,似乎爲我工作。我已經添加+字符處理「加尋址」(如[email protected]

function replaceemail($text) {- 
    $ex = "/([a-zA-Z0-9._+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})/"; 
    preg_match_all($ex, $text, $url); 
    foreach($url[0] as $k=>$v) $text = str_replace($url[0][$k], '<a href="mailto:'.$url[0][$k].'" target="_blank" rel="nofollow">'.$url[0][$k].'</a>', $text); 
    return $text; 
} 
+0

輸出的HTML非常混亂,重複了網站文本中的HTML鏈接很多次。這是一個屏幕截圖:http://is.gd/bnAnQU – 2014-07-14 07:17:20

相關問題