2014-01-15 50 views
2

我從我的數據庫中得到很多文本值,需要在需要引用字符之前添加斜線輸出。只有在前面沒有添加斜線時纔會用addslashes()

問題是,一些數據已經從前面添加了斜槓,而其中一些沒有。

如何使用例如addslashes()添加斜槓 - 但同時確保在斜槓已添加的情況下不會添加額外的斜槓?

實施例:

Input: <a href="test.html">test</a> 
Output should be: <a href=\"test.html\">test</a> 

Input: <a href=\"test.html\">test</a> 
Output should be: <a href=\"test.html\">test</a> 

這是PHP 5.3.10。

回答

1

如果您知道您沒有任何雙斜槓,只需運行addslashes(),然後將所有\\替換爲\

+0

如果存在具有多於2個反斜線的可能性噸,可以考慮使用一個遞歸函數,並用'strpos檢查()'。 – Mave

1

如果你有這樣的事情:

<a href=\"test.html\">test</a> 

使用和addslashes(),輸出將是:

<a href=\\\"test.html\\\">test</a> 

所以,你可能需要更換一個以上的每次出現\可以肯定

0
function addslashes($string) { 
    return preg_replace('/([^\\\\])\"/','$1\"',$string); 
} 
0

Qaflanti的答案是正確的,但我想m讓它更完整,如果你想逃避單引號和雙引號。

第一種選擇:

function escape_quotes($string) { 
    return preg_replace("/(^|[^\\\\])(\"|')/","$1\\\\$2", $string); 
} 

輸入

我愛\ 「carots \」,而是 「我」 不喜歡\ '櫻桃\'

輸出

我愛\ 「carots \」,但是\ 「I \」 唐\ '噸像\' 櫻桃\」

說明:

\有在引用的表達式中有特殊含義,並且會在字符串中轉義下面的字符,所以雖然您需要在正則表達式中編寫\\以搜索反斜槓字符,但在PHP中,您還需要轉義這兩個反斜槓,總共4個反斜槓。

考慮到這一點

所以,第一個捕獲組,然後搜索單個字符不是反斜線(而不是兩個或四個反斜槓具有誤導性,因爲它是)

第二個捕獲組將搜索雙倍或單引號 恰好一次。

因此,這會找到未轉義的引號(雙精度和單精度)並在引號之前添加一個反斜槓,從而轉義它。

Regex visual explanation

第二個選項:

或者,它可能只是對你最好將它們轉換爲HTML從一開始就實體:

function htmlentities_quotes($string) { 
    return str_replace(array('"', "'"), array("&quot;", "&apos;"), $string); 
} 

然後你只需要使用php函數htmlspecialchars_decode($string);將其恢復爲原來的樣子。

輸入

我愛 「carots」,而是 「我」 不喜歡 '櫻桃'

輸出

我愛&quot; carots &quot;&quot; I &quot; don &apos;&apos;櫻桃&apos;

+1

我沒有downvote,但我認爲至少第一個代碼塊需要解釋(特別是使用正則表達式)。 – BDL

+0

好吧我會編輯解釋 – Tofandel

+0

@BDL完成解釋 – Tofandel

相關問題