【问题标题】:PHP Regular Expression - Single Quote not working - TWIG pre-escapingPHP 正则表达式 - 单引号不起作用 - TWIG 预转义
【发布时间】: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 的内容:#(?!&lt;\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 实体 &amp;quot; 或一些 unicode 符号?
  • 你的代码好像没有问题:3v4l.org/IYOg5
  • 谢谢!谢谢你。你让我走对了路,我在上面更新了我的问题。
  • @titanbird 如果你在替换之前“逃脱”你的表情会发生什么(例如$emoticon = nl2br($emoticon);就在你之前preg_quote它)
  • @iLot,工作!我在 replaceEmoticons 方法中添加了一个可选参数,$encode_emoticons = true。因此,表情符号被编码,字符被转换为 html 符号。我认为这根本不是最好的方法,但它确实有效。有时我想将此方法应用于未转义的输入字符串。但这没关系。在这种情况下,我可以使用 replaceEmoticons(false)。谢谢!

标签: php preg-replace expression twig


【解决方案1】:

我在表情方法中添加了一个可选参数:

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

我将 foreach 部分更改了一点:

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

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

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

}

有效!所有表情都被替换了!

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2011-03-31
    • 2011-05-01
    • 1970-01-01
    • 2010-12-21
    • 2011-08-07
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多