尝试使用正则表达式解析 BBCode 时,点不将文本与换行符匹配

发布于 2024-09-25 07:33:51 字数 664 浏览 14 评论 0原文

我正在为我的论坛使用一些 BBCode 解析功能。

当两个 b 标签之间的文本中没有换行符时,它效果很好。

[b]Text[/b]

它将以粗体打印文本。

但是,如果内部文本包含换行符,则无法正确替换。

[b]
Text[/b]

我的功能:

function BBCode ($string) {
    $search = array(
        '#\[b\](.*?)\[/b\]#',
    );
    $replace = array(
        '<b>\\1</b>',
    );
    return preg_replace($search , $replace, $string);
}

然后当回显它时:

echo nl2br(stripslashes(BBCode($arr_thread_row[main_content])));

示例文本:

[b]    

Text

[/b]

应该变成:

<b>

Text

</b>

I am using a little BBCode parsing function for a forum I have.

It works well when the text between two b tags has no newlines in it.

[b]Text[/b]

it will print Text in bold.

However, if the inner text contains a newline, it doesn't replace properly.

[b]
Text[/b]

My function:

function BBCode ($string) {
    $search = array(
        '#\[b\](.*?)\[/b\]#',
    );
    $replace = array(
        '<b>\\1</b>',
    );
    return preg_replace($search , $replace, $string);
}

Then when echo'ing it:

echo nl2br(stripslashes(BBCode($arr_thread_row[main_content])));

Sample text:

[b]    

Text

[/b]

Should become:

<b>

Text

</b>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

酸甜透明夹心 2024-10-02 07:33:51

实际上有一个pecl扩展可以解析BBcode,这样会更快更安全而不是自己从头开始编写。

There is actually a pecl extension that parses BBcode, which would be faster and more secure than writing it from scratch yourself.

§对你不离不弃 2024-10-02 07:33:51

您需要 多行修饰符,它使您的模式变得更有价值就像 #\[b\](.*?)\[/b\]#ms

(注意尾随的 m

You need the multiline modifier, which makes your pattern something like #\[b\](.*?)\[/b\]#ms

(note the trailing m)

我是男神闪亮亮 2024-10-02 07:33:51

我用这个...应该有用。

$bb1 = array(
"/\[url\](.*?)\[\/url\]/is",
"/\[img\](.*?)\[\/img\]/is",
"/\[img\=(.*?)\](.*?)\[\/img\]/is",
"/\[url\=(.*?)\](.*?)\[\/url\]/is",
"/\[red\](.*?)\[\/red\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[h(.*?)\](.*?)\[\/h(.*?)\]/is",
"/\[php\](.*?)\[\/php\]/is"
);

$bb2 = array(
'<a href="\\1">\\1</a>',
'<img alt="" src="\\1"/>',
'<img alt="" class="\\1" src="\\2"/>',
'<a rel="nofollow" target="_blank" href="\\1">\\2</a>',
'<span style="color:#ff0000;">\\1</span>',
'<span style="font-weight:bold;">\\1</span>',
'<h\\1>\\2</h\\3>',
'<pre><code class="php">\\1</code></pre>'
);

$html = preg_replace($bb1, $bb2, $html);

I use this... It should work.

$bb1 = array(
"/\[url\](.*?)\[\/url\]/is",
"/\[img\](.*?)\[\/img\]/is",
"/\[img\=(.*?)\](.*?)\[\/img\]/is",
"/\[url\=(.*?)\](.*?)\[\/url\]/is",
"/\[red\](.*?)\[\/red\]/is",
"/\[b\](.*?)\[\/b\]/is",
"/\[h(.*?)\](.*?)\[\/h(.*?)\]/is",
"/\[php\](.*?)\[\/php\]/is"
);

$bb2 = array(
'<a href="\\1">\\1</a>',
'<img alt="" src="\\1"/>',
'<img alt="" class="\\1" src="\\2"/>',
'<a rel="nofollow" target="_blank" href="\\1">\\2</a>',
'<span style="color:#ff0000;">\\1</span>',
'<span style="font-weight:bold;">\\1</span>',
'<h\\1>\\2</h\\3>',
'<pre><code class="php">\\1</code></pre>'
);

$html = preg_replace($bb1, $bb2, $html);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文