2013-06-27 86 views
1

我有一個函數,它是財產以後這樣的:有條件的字符串替換

function replaceXMLEntities($subject) { 
$subject = str_replace("&", "&", $subject); 
$subject = str_replace("'", "'", $subject); 
$subject = str_replace("<", "&lt;", $subject); 
$subject = str_replace(">", "&gt;", $subject); 
$subject = str_replace("\"", "&quot;", $subject); 

return $subject; 
} 

此功能用於將字符串轉換爲xmpl編碼一個安全的字符串。

但我有一個問題,即casses編碼的2倍一些xmpl數據水電站,像

&amp; 

的開關輸入,當你沒有代碼輸入文本到達

&&amp; 

就像在這裏報價:)

我需要一個正則表達式,它可以區分&和&類似

if not &amp then do & -> &amp; conversion else dont touch it. 

任何想法如何我可以存檔這樣的正則表達式?我可以去做一個功能,但在這種情況下,正則表達式顯然是更好的選擇。

回答

1

$subject = preg_replace('#(?!&amp;)&#', '&amp;', $subject);

雖然使用htmlspecialchars()可能會更容易...

1

您也可以用&第一替換所有&amp引擎實現無正則表達式是相同的:

$subject = str_replace("&amp;", "&", $subject); 
+0

簡單而璀璨的你:3 – Sangoku

0

性交方式:

preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', '&amp; & &lt; &gt;'); 

簡單而正確的方法是使用htmlspecialchars()

0

很簡單使用preg_replace()正則表達式
$subject = preg_replace('&(?!amp;)', '', $subject);

&:比賽&                                                                                             (?!amp;):負先行,檢查是否有沒有amp;

我們仍然使用str_replace()爲其他字符,但請注意,它支持多種輸入/替換,所以我們的最終代碼將是:

function replaceXMLEntities($subject){ 
    $subject = preg_replace('&(?!amp;)', '', $subject); 
    $subject = str_replace(array("'", '<', '>', '"'), array('&apos;', '&lt;', '&gt;', '&quot;'), $subject); 

    return $subject; 
} 

你也可以使用一個取巧的辦法,先更換所有&amp;&然後替換所有&&amp;

function replaceXMLEntities($subject){ 
    return str_replace(array('&amp;', '&', "'", '<', '>', '"'), array('&', '&amp;', '&apos;', '&lt;', '&gt;', '&quot;'), $subject); 
}