2015-11-02 78 views
4

的如何更換雙反斜線的組中的字符串*PHP更換組雙反斜線

例如:

\\\\a -> **a 
\\\a -> *\a 
\\a -> *a 
\a -> \a 

我嘗試同時使用str_replacepreg_replace但未能在第二種情況下

str_replace('\\', '*', $str); 
preg_replace('/\\\\/', '*', $str); 

=> `\\\a` -> `**a` 

的原因我想要做到這一點是我想要的東西相同Split string by delimiter, but not if it is escaped

$str = '1|2\|2|3\\|4\\\|4'; 
$r = preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $str); 
var_dump($r); 

給我。

0 => string '1' (length=1) 
    1 => string '2\|2' (length=4) 
    2 => string '3\|4\\' (length=6) 
    3 => string '4' (length=1) 

我期待像

[0] => 1 
    [1] => 2\|2 
    [2] => 3\\ 
    [3] => 4\\\|4 

PHP 5.4.45-2

回答

3

在PHP單引號字符串反斜槓必須用反斜槓2聲明:打印1|2\|2|3\\|4\\\|4你需要$str = '1|2\\|2|3\\\\|4\\\\\\|4';

在正則表達式中,文字反斜槓可以匹配4個反斜槓。

這裏是一個更新PHP code

$str = '1|2\\|2|3\\\\|4\\\\\\|4'; 
// echo $str . PHP_EOL; => 1|2\|2|3\\|4\\\|4 
$r = preg_split('~\\\\.(*SKIP)(*FAIL)|\\|~s', $str); 
var_dump($r); 

結果:

array(4) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(4) "2\|2" 
    [2]=> 
    string(3) "3\\" 
    [3]=> 
    string(6) "4\\\|4" 
} 

,並獲得**a\\a你可以這樣使用

$str = '\\\\a'; 
$r = preg_replace('~\\\\~s', '*', $str); 

another demo

+0

讓我說我的原始字符串是''1 | 2 \ | 2 | 3 \\ | 4 \\\ | 4';'我怎樣才能將它轉換爲''1 | 2 \\ | 2 | 3 \\ \\ | 4 \\\\\ | 4';'? – Hardy

+0

我不知道你怎麼能[從'3 \ 4''告訴'2 \ 2'](https://ideone.com/pjTLHG)。即使您使用['$ byte_array = unpack('C *',$ str);'](https://ideone.com/HLTE1b)將字符串轉換爲字節數組,您也不會發現它們之間的差異。 –