$str = "& &svnips  ∴ ≈ osidnviosd & sopinsdo";
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);
我試圖用編碼的替換所有未編碼的&符號。
問題是它刪除了&
和sopinsdo
之間的空間。爲什麼我的正則表達式刪除空格?
任何想法爲什麼?
$str = "& &svnips  ∴ ≈ osidnviosd & sopinsdo";
$regex = "/&[^\w;]/";
echo preg_replace($regex, "&", $str);
我試圖用編碼的替換所有未編碼的&符號。
問題是它刪除了&
和sopinsdo
之間的空間。爲什麼我的正則表達式刪除空格?
任何想法爲什麼?
爲什麼使用正則表達式?爲什麼不使用htmlspecialchars()
?
echo htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8', false);
注意第四個參數。它告訴它不要加倍編碼任何東西。所以基本上,這將關閉所有<
爲<
,所有>
爲>
,所有&
不屬於現有實體的一部分進入&
但是,如果你必須使用正則表達式,你可以這樣做:
$regex = '/&([^\w;])/';
echo preg_replace($regex, '&\1', $str);
基本上,它保存了非單詞字符,然後將其添加回去...
您搜索2個字符(「&」,這是不是一個字符(或\ W)),並與&
更換你應該&
替換(添加一個空格替換字符串的結尾)
所以你不想刪除&和sopinsdo之間的空間。只需添加一個
echo preg_replace($regex, "& ", $str);
是的,但是'&$ foo'會失敗(它會將它轉換爲'& foo')... – ircmaxell 2010-08-13 14:43:55
這個正則表達式可以做你要找的東西。
preg_replace('/&(?!\w+;)/', '&', $text);
因此,對於一些簡單的測試案例,你可以得到正確轉義HTML:
'& sopinsdo' -> '& sopinsdo'
'& sopinsdo' -> '& sopinsdo'
'sopinsdo & foo; bar' -> 'sopinsdo & foo; bar'
'sopinsdo &foo bar' -> 'sopinsdo &foo bar'
這有同樣的問題,如下unigg的答案。有些情況會導致不良行爲。 – eldarerathis 2010-08-13 15:14:06