【问题标题】:bbCode in an anotherbbCode 在另一个
【发布时间】:2012-07-17 13:42:41
【问题描述】:

我制作了一个自定义函数,其作用类似于 bbCode。我正在使用 preg_replace 和正则表达式。唯一的问题是,如果我使用不止一种 bbCode 格式,那么只有一种有效..

[align=center][img]myimagelink[/img][/align]

如果我输入此行,则图像会出现,但 [align=center]image[/align] 也会出现。如何避免这个问题?

$patterns[2] = '@\[align=(.*)\](.*)\[\/align\]@si';
$patterns[9] = '@\[img\](.*\.jpg)\[\/img\]@si';
$replacements[2] = '<table align=\1><tr><td align=\1>\2</td></tr></table>';//ALIGN
$replacements[9] = '<img src=\"$1\"/>';//image

【问题讨论】:

  • 你的模式是贪婪的,所以[align]会匹配[align=something[/align][/align]这样的东西。
  • 我会按原样搜索和替换图像,但是像 'align' 这样的成对标签作为单曲,即将 [align=center] 和 [/align] 视为单独的实体。所以替换不会包含标签之间的代码

标签: php html regex bbcode


【解决方案1】:

.* 表达式更改为非贪婪 (.*?) 对您有用。

例子:

$in = '[align=center][img]myimagelink[/img][/align]';
$patterns = array(
    '~\[align=(left|right|center)\](.*?)\[/align\]~' => '<div style="text-align: $1">$2</div>',
    '~\[img](.*?)\[/img\]~' => '<img src="$1" />',
);

$rep = preg_replace(array_keys($patterns), $patterns, $in);
echo htmlspecialchars($rep);

【讨论】:

    【解决方案2】:

    我建议使用现有的 JavaScript 库,而不是重新发明轮子。

    我相信 StackOverflow 使用 Prettify 来格式化用户输入。

    【讨论】:

      【解决方案3】:

      正如@nickb 所说,你的模式是贪婪的。 (.*) 抓住一切。尝试将其更改为(.*?)

      【讨论】:

        【解决方案4】:

        将所有标签视为单个而不是成对

        $patterns[2] = '@\[align=(.*)\]@si';
        $patterns[3] = '@\[\/align\]@si';
        $patterns[9] = '@\[img\](.*\.jpg)\[\/img\]@si';
        $replacements[2] = '<div align=\"$1\">';//ALIGN
        $replacements[3] = '</div>';//ALIGN
        $replacements[9] = '<img src=\"$1\"/>';//image
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-13
          • 1970-01-01
          • 2011-08-21
          • 2011-02-14
          • 1970-01-01
          • 1970-01-01
          • 2016-04-12
          • 1970-01-01
          相关资源
          最近更新 更多