【问题标题】:Making a [code][/code] for BBcode with php regex使用 php regex 为 BBcode 制作 [code][/code]
【发布时间】:2015-09-13 21:40:15
【问题描述】:

我想为 bbcode 制作一个 [code][/code] 标签,这样我制作的 php 正则表达式就不会考虑里面的内容。

例子:

Hello [b]newbie[/b], to write in bold, use the following : [code][b](YOURTEXT)[/b][/code]

应该以 HTML 格式返回:

Hello <strong>newbie</strong>, to write in bold, use the following : [b](YOURTEXT)[/b]

这是我的 bbcode 函数的一部分的视图:

<?
function bbcode($var) {
   $var = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $var); 
   $var = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $var);
   $var = preg_replace('`\[u\](.+)\[/u\]`isU', '<u>$1</u>', $var);
   return $var;
}
?>

提前感谢您的帮助!


编辑: 以下是我最终实现它的方法:

<? 
function bbcode($var) {
$var2 = preg_split('`(\[code].*?\[/code])`isU', $var, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

$var = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $var); 
$var = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $var);
$var = preg_replace('`\[u\](.+)\[/u\]`isU', '<u>$1</u>', $var);

$var = preg_replace('`(\[code].*?\[/code])`isU', $var2[1], $var);
$var = preg_replace('`\[code\](.+)\[/code\]`isU', '<div>$1</div>', $var);
return $var;
}

$text = 'Hello [b]newbie[/b], to write in bold, use the following [u]lol[/u] : [code][b](YOURTEXT) [u]lol[/u][/b][/code] [b][u]LOL[/u][/b]';

echo bbcode($text); 
?>

但是,还有一个新问题:例如,如果字符链直接以'[code]'开头

[code][b]hello[/b][/code]测试

结果将是:

测试测试

这是因为 $var2[1] 现在指向 [/code] 之后的内容。

有人可以帮我做一个更好的定界,这也适用于第二个字符链吗?提前谢谢你!

【问题讨论】:

  • 我不确定你想做什么......无论如何,你正在使用贪婪的正则表达式......你应该将(.+)修改为惰性表达式(.+?)
  • 我想要做的是 [code] 标签内的 bbcode(在示例中:[b](YOURTEXT)[/b])不会转换为 (YOURTEXT) 。问题是我不知道如何为 [code] 制作一个 preg_replace,它不会更改该标签内的所有 bbcode :(
  • 我唯一的想法是在函数的开头做一些事情,将 '[' 转换为 ':beg:' 和 ']' 转换为 ':end:' 然后在底部函数将其重新转换为 '[' 和 ']'。但问题再次是我不知道如何 - 仅 - 将其应用于 2 个标签之间的特定字符链并忽略字符链的其余部分。而且可能有更好的方法,但我不知道如何>
  • 使用(\[code].*?\[/code]) 分割字符串,使用PREG_SPLIT_DELIM_CAPTURE 选项捕获分隔符,并将其他替换仅应用于数组的偶数项。但是无论你决定做什么,你都需要改变你的函数来处理嵌套标签。
  • 感谢 Casimir 提供 PREG_SPLIT_DELIM_CAPTURE 功能,但我还没有让我的脚本完美运行(参见:编辑后的帖子)

标签: php regex preg-replace bbcode preg-split


【解决方案1】:

最后,我解决了我遇到的所有问题:

<?
function bbcode($var) {
   $var2 = getStringBetween($var, '[code]', '[/code]');

   $var = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $var); 
   $var = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $var);
   $var = preg_replace('`\[u\](.+)\[/u\]`isU', '<u>$1</u>', $var);

   $var = preg_replace('`(\[code].+\[/code])`isU', '<div>'.$var2.'</div>', $var);
   return $var;
}

function getStringBetween($str,$from,$to)
{
    $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str));
    return substr($sub,0,strpos($sub,$to));
}

$text = 'Hello [b]newbie[/b], to write in bold, use the following [u]lol[/u] : [code][b](YOURTEXT) [u]lol[/u][/b][/code] [b][u]LOL[/u][/b]';

echo bbcode($text); 
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2017-06-29
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多