Проблема при замене строк через strtr и preg_replace
Очень простое выражение замены почему-то не работает в вордпрессе. Нужно всего лишь заменить кавычку после пробела: [ "] - на кавычку-ёлочку: [ «] (опустим вопрос, почему не годится собственная замена вордпрессовского редактора). Не работает в виде:
strtr($comment_text, " \"", " «")
Не работает в виде:
preg_replace('/\s"/', ' «', $comment_text);
preg_replace('/\ "/', ' «', $comment_text);
preg_replace('/ "/', ' «', $comment_text);
При этом замена работает и в том, и в другом виде, если вместо кавычки заменяется другой символ. Использование вместо кавычки мнемоник не помогло.
Почему именно в вордпрессе это не срабатывает и как можно обойти эту странность? Второй вопрос важнее, но и первый тоже хотелось бы понять. Заранее спасибо.
Ответы (1 шт):
Попробую объяснить, но только что касается функции strtr().
Всё дело в нескольких следующих вещах:
- Функцию
strtr()можно использовать в двух разных режимах: с использованием трёх аргументов (в этом случае при поиске и сравнении заменяемой и заменяющей строки будет происходить побайтное преобразование - один символ на другой); и с использованием двух аргументов (второй аргумент - массив, и в этом случае поиск и сравнение ведётся уже более длинными строками). - Также если длины заменяемой и заменяющей строки разные, то уже "лишние" символы в более длинной строке никак использоваться в поиске и замене не будут.
Зная информацию из пункта №1 и №2, мы видим, что строка " \"" содержит три символа: пробел, слеш, кавычку, а строка " «" - пробел и "ёлочку". Длина строк разная. Сравнение побайтовое (символ с символом). Получается следующее: ищем пробел->находим->заменяем. Ищем слеш->не находим->не заменяем. Конец. Далее ничего не ищем, так как "лишний" символ уже используется.
А решением будет использование функции strtr() с двумя аргументами.
$replace = array(" \"" => " «");
$text = 'просто текст с кавычками "В кавычках"';
$text = strtr($text, $replace);
var_dump($text); //просто текст с кавычками «В кавычках" - то, что нужно
А по поводу не срабатывания замены в functions.php - всё должно работать. Может, делаете это в какой-то другой функции, которая не пытается нигде вызываться и срабатывать..?