2010-08-13 110 views
3
$str = "& &svnips   Â ∴ ≈ osidnviosd & sopinsdo"; 
$regex = "/&[^\w;]/"; 
echo preg_replace($regex, "&", $str); 

我試圖用編碼的替換所有未編碼的&符號。
問題是它刪除了&sopinsdo之間的空間。爲什麼我的正則表達式刪除空格?

任何想法爲什麼?

回答

2

爲什麼使用正則表達式?爲什麼不使用htmlspecialchars()

echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false); 

注意第四個參數。它告訴它不要加倍編碼任何東西。所以基本上,這將關閉所有<&lt;,所有>&gt;,所有&不屬於現有實體的一部分進入&amp;

但是,如果你必須使用正則表達式,你可以這樣做:

$regex = '/&([^\w;])/'; 
echo preg_replace($regex, '&amp;\1', $str); 

基本上,它保存了非單詞字符,然後將其添加回去...

2

您搜索2個字符(「&」,這是不是一個字符(或\ W)),並與&amp;

更換你應該&amp;替換(添加一個空格替換字符串的結尾)

+1

這有同樣的問題,如下unigg的答案。有些情況會導致不良行爲。 – eldarerathis 2010-08-13 15:14:06

0

所以你不想刪除&sopinsdo之間的空間。只需添加一個

echo preg_replace($regex, "&amp; ", $str); 
+2

是的,但是'&$ foo'會失敗(它會將它轉換爲'& foo')... – ircmaxell 2010-08-13 14:43:55

1

這個正則表達式可以做你要找的東西。

preg_replace('/&(?!\w+;)/', '&amp;', $text); 

因此,對於一些簡單的測試案例,你可以得到正確轉義HTML:

'& sopinsdo'   -> '&amp; sopinsdo' 
'&amp; sopinsdo'  -> '&amp; sopinsdo' 
'sopinsdo & foo; bar' -> 'sopinsdo &amp; foo; bar' 
'sopinsdo &foo bar' -> 'sopinsdo &amp;foo bar'