У меня проблема с одинарными кавычками в регулярном выражении.
То, что я хочу сделать, это заменить смайлики в строке на 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 тоже ускользает. Это неплохая идея, но в моем случае это уничтожит весь грустный смайлик, содержащийся в нем.
Все еще ищу решение, чтобы решить эту проблему, и я надеюсь, что вы можете мне помочь.
Лучший,
исполин
Я добавил необязательный параметр в метод смайлика:
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, '#');
}
Оно работает! Все смайлики заменены!
Других решений пока нет …