2013-11-10 52 views
0

我試圖想出一種方法來查找字符串中的所有RegEx匹配,然後通過我寫的函數運行所有這些匹配,但我沒有運氣。使用PHP函數與正則表達式匹配

具體來說,我試圖找到一個字符串中的所有電子郵件地址,然後使用一個函數將這些地址轉換爲有用的mailto鏈接,這些鏈接隱藏垃圾郵件機器人的地址。

因此,我從普通的舊RegEx開始將地址轉換爲mailto鏈接,只是讓我知道這些匹配正在工作。

$pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[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>"; 
$description = preg_replace($pattern, $replacement, $description); 

工程很好。到現在爲止還挺好。但是,當我嘗試使用我的函數來操縱地址字符串時,電子郵件地址不再匹配。

$pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i'; 
$replacement = myFunction('\\1'); 
$description = preg_replace($pattern, $replacement, $description); 

我在做什麼錯?

+1

['preg_replace_callback'](http://php.net/preg_replace_callback)是你正在尋找的。 – mario

回答

3
$description = preg_replace_callback($pattern, 'myFunction', $description); 

檢查preg_replace_callback()手冊上了解它是如何工作的。

myFunction()函數應該是編碼這樣的:

function myFunction($matches) 
{ 
    return sprintf('<a href="mailto:%s">%s</a>', $matches[1], $matches[1]); 
} 

preg_replace_callback()使用與閉合(PHP 5.3+):

$description = preg_replace_callback($pattern, function ($matches) { 
    return myFunction($matches[1]); 
}, $description); 
+0

謝謝,但我不知道這個解決方案是否適用於我的情況。首先,我的許多頁面都使用了myFunction(它包含在我的所有頁面中的包含文件中),所以我無法爲此特定情況對其進行自定義。其次,myFunction實際上有三個參數(爲了便於閱讀,我在這裏發佈的代碼中只顯示了一個參數)。那麼preg_replace_callback仍然是這裏的解決方案嗎? – Dave

+0

'preg_replace_callback()'將匹配傳遞給回調函數作爲參數。你可能想創建一個使用你的'myFunction()'的新回調函數,或者甚至更好地使用閉包作爲回調函數(PHP 5.3+)。我會用一個閉包例子更新我的答案。 :) –