【发布时间】:2014-11-08 02:18:34
【问题描述】:
我遇到了正则表达式中的单引号问题。 我想要做的是将字符串中的笑脸替换为 html 图像标签。 所有的笑脸都在工作,除了悲伤的笑脸:'-(因为它有一个单引号。 Magic Quotes 已关闭(testet with 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)#
这里有什么问题,你能帮帮我吗?
更新:
感谢@cheery 和 cychoi。替换方法没问题,你说得对。 我发现了问题。我的字符串在转发到 replaceEmoticons 方法之前被转义。我使用 TWIG 模板引擎,并在我自制的 replace_emoticon 过滤器之前使用 |nl2br 过滤器。 让我演示给你看。这是最终模板中的输出。这是一个显示博客条目评论的模板:
{{ comment.content|nl2br|replace_emoticons|raw }}
问题:nl2br 自动预转义输入字符串,因此 ' 被转义的 '
替换我需要这个 nl2br 来将换行符显示为
- 我也需要转义,以禁止用户输入中的 html 标记。
我需要 replace_emoticons 来替换我的表情符号(自制的 TWIG 扩展)。
而且我在过滤器链的末尾也需要 raw ,否则所有 HTML 笑脸 img 标签都会被转义,我会在评论的文本中看到 raw html。
我可以在这里做什么?这里唯一的问题似乎是 nl2br 也逃脱了 ' 。这不是一个坏主意,但在我的情况下,它会破坏所有包含 ' 的悲伤笑脸。
仍在寻找解决此问题的解决方案,希望您能帮助我。
最好, 泰坦
【问题讨论】:
-
你能显示输入字符串吗?可能它没有引号,但 html 实体
&quot;或一些 unicode 符号? -
你的代码好像没有问题:3v4l.org/IYOg5
-
谢谢!谢谢你。你让我走对了路,我在上面更新了我的问题。
-
@titanbird 如果你在替换之前“逃脱”你的表情会发生什么(例如
$emoticon = nl2br($emoticon);就在你之前preg_quote它) -
@iLot,工作!我在 replaceEmoticons 方法中添加了一个可选参数,$encode_emoticons = true。因此,表情符号被编码,字符被转换为 html 符号。我认为这根本不是最好的方法,但它确实有效。有时我想将此方法应用于未转义的输入字符串。但这没关系。在这种情况下,我可以使用 replaceEmoticons(false)。谢谢!
标签: php preg-replace expression twig