2011-08-27 194 views
0

我正在嘗試將自動標記檢測和轉換爲超鏈接。問題是,它有這個字符串是通過以下運行之後進行:不包含某些字符的匹配字符串

htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 

現在,即'符號變成'。這些標籤的形式是#[a-Z0-9\-\_]

因此,由於#39部分,腳本將編碼的特殊字符視爲標籤。

我如何與preg_match相匹配那麼它不會考慮#標記之前是&標記爲標記?

謝謝!

+0

這裏有一個教程:HTTP:// www.phpro.org/tutorials/Introduction-to-PHP-Regex.html#11 – JRL

+0

請記住,「&」可能是網址的一部分。 Htmlspecialchars()將「&」更改爲「&」,因此後面的後續建議仍然可以可靠地工作,但是url匹配會更復雜。也許倒過htmlspecialchars更簡單,做你的事,然後重做htmlspecialchars(如果你不能在htmlspecialchars之前得到它)。 –

回答

0

使用Look Behind assertion

(?<!a)b匹配不是前面有一個 「B」 的 「一」

在你的情況,這將是

(?<!&)#[a-Z0-9\-\_] 

不匹配#前面有&

+0

工作就像一個魅力!總是有新東西來學習:) – FinDev

2

你必須使用一個lookbehind assertion檢查該字符串前面沒有&

試試這個:

"/(?<!&)#[\w-]+/" 

(?<!&)原因#只有當它是相匹配之前沒有&

\w部分匹配[a-zA-Z0-9_]

您可能還需要檢查標籤由一個空格前面或者是字符串的開頭:

"/(:?^|\s)#[\w-]+/" 
相關問題