2015-11-02 6 views
4

как заменить группу двойной обратной косой черты в строке в *PHP заменить группу двойной обратной косой черты

, например:

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

Я стараюсь использовать как str_replace и preg_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'; ,

В регулярном выражении буквальная обратная косая черта может быть сопоставлена ​​с четырьмя обратными косыми чертами.

Вот обновленный 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

Я не знаю, как вы можете [сообщать '2 \ | 2' из' 3 \ | 4'] (https://ideone.com/pjTLHG). Даже если вы преобразуете строку в массив байтов с ['$ byte_array = unpack ('C *', $ str);'] (https://ideone.com/HLTE1b), вы не найдете разницы. –

Смежные вопросы