preg replace — регулярное выражение PHP — не работает одинарная кавычка — предварительное экранирование TWIG

У меня проблема с одинарными кавычками в регулярном выражении.
То, что я хочу сделать, это заменить смайлики в строке на HTML-тег изображения.
Все смайлики работают, кроме грустного смайлика: ‘- (потому что в нем есть одиночная кавычка.
Магические кавычки отключены (протестируйте с помощью if (g! Et_magic_quotes_gpc ()) dd (‘mq off’);).

Итак, позвольте мне показать вам некоторый код.

    protected $emoticons = array(
// ...
'cry' => array(
'image' => '<img class="smiley" src="/image/emoticon/cry.gif" />',
'emoticons' => array(":'(", ";'(", ":'-(", ";'-(")
),
);

Мой метод замены всех смайликов следующий:

    public function replaceEmoticons($input) {

$output = $input;

foreach ($this->emoticons as $emo_group_name => $emo_group) {

$regex_emo_part = array();

foreach ($emo_group['emoticons'] as $emoticon) {
$regex_emo_part[] = preg_quote($emoticon, '#');
}

$regex_emo_part = implode('|', $regex_emo_part);
$regex = '#(?!<\w)(' . $regex_emo_part .')(?!\w)#';
$output = preg_replace($regex, $emo_group['image'], $output);

}

return $output;

}

Но, как я уже сказал: «убивает это. Там нет замены. :-): — / и так далее работают. Зачем?
К вашему сведению: $ regex: #(?!<\w)(\:\'\(|;\'\(|\:\'\-\(|;\'\-\()(?!\w)#

Что здесь не так, вы можете мне помочь?

ОБНОВИТЬ:

Спасибо @ веселый и Cychoi. Метод замены в порядке, вы правы.
Я нашел проблему. Моя строка экранируется до того, как она будет перенаправлена ​​в метод replaceEmoticons. Я использую шаблонизатор TWIG и использую фильтр | nl2br перед моим самодельным фильтром replace_emoticon.
Позволь мне показать тебе. Это вывод в окончательном шаблоне. Это шаблон для отображения комментария к записи в блоге:

{{ comment.content|nl2br|replace_emoticons|raw }}

Проблема: nl2br автоматически предварительно экранирует входную строку, поэтому ‘заменяется на экранированную &# 039;

Мне нужен этот nl2br, чтобы показать переводы строк как <бр /> — и мне тоже нужно экранирование, чтобы запретить теги html на входе пользователя.
Мне нужны replace_emoticons, чтобы заменить мои смайлики (самодельное расширение TWIG).
И здесь мне нужен raw в конце цепочки фильтров, иначе все HTML-теги smiley img будут экранированы, и я увижу raw html в тексте комментария.

Что я могу сделать здесь? Единственная проблема здесь, кажется, в том, что nl2br тоже ускользает. Это неплохая идея, но в моем случае это уничтожит весь грустный смайлик, содержащийся в нем.

Все еще ищу решение, чтобы решить эту проблему, и я надеюсь, что вы можете мне помочь.

Лучший,
исполин

3

Решение

Я добавил необязательный параметр в метод смайлика:

public function replaceEmoticons($input, $use_emo_encoding_for_regex = true) {

и я немного изменил переднюю часть:

foreach ($emo_group['emoticons'] as $emoticon) {

if ($use_emo_encoding_for_regex === true) {
$emoticon = htmlspecialchars($emoticon, ENT_QUOTES);
}

$regex_emo_part[] = preg_quote($emoticon, '#');

}

Оно работает! Все смайлики заменены!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector