2010-10-21 44 views
0

我有這段代碼在HTML內容上做了一些醜陋的內嵌文本樣式顏色格式。 但是,這將標籤內的任何內容作爲鏈接和電子郵件進行分解。preg_replace只在文本而不在href的

我已經想通了halfways如何防止它從格式化的聯繫,但它仍然無法阻止替代文本爲[email protected]

$text = preg_replace('/(?<!\.)mytext(?!\/)/', '<span style="color:#DD1E32">my</span><span style="color:#002d6a">text</span>', $text); 

什麼將是一個更好的辦法只替換文字,並防止鏈接上的替換?

+0

使用HTML解析器('DOMDocument'例如)。您不能使用正則表達式來可靠地更改HTML。在SO上搜索數百個相同的問題。 – Wrikken 2010-10-21 16:27:18

回答

1

更好的方法是使用XML函數。

0

您的lookbehind斷言只測試一個字符,所以它不足以斷言HTML標記之外的匹配。這是正則表達式不是最佳選擇的地方。然而,你可以得到這樣一個近似:

preg_replace("/(>[^<]*)(?<![@.])(mytext)/", "$1<span>$2</span>", 

這會忽略mytext的第一occourence如果它不是由HTML標籤preceeded。所以最好如果$text = "<div>$text</div>"什麼的。

0

[編輯]哦,我看到你解決了href問題。 解決您的電子郵件問題,更改所有@mytext。在對文本進行處理之前,使用str_replace將[email_safeguard]添加到[email_safeguard],並在完成時將其更改回來。 :)

$text = str_replace('[email protected]','[email_safeguard]',$text); 
//work on the text with preg_match() 
$text = str_replace('[email_safeguard]','[email protected]',$text); 

應該做的伎倆:)

但隨着人們之前已經提到的,你最好避免HTML和正則表達式,否則你會受到邪神的憤怒。

see this instead

相關問題