Preg_replace правильно несколько bbcodes - PullRequest
1 голос
/ 17 августа 2011

Текущий Я создаю функцию bbCodes, чтобы заменить все bbCodes соответствующими HTML-кодами в тексте. Мой код работает следующим образом:

public function bbCodes($text) {

    global $bb_codes;

    $text = preg_replace(array_keys($bb_codes), array_values($bb_codes), $text);

    return $text;

}

где $ bb_codes выглядит так:

$bb_codes = array(
            "/\[b\](.*)\[\/b\]/is" => "<b>$1</b>",
            "/\[u\](.*)\[\/u\]/" => "<u>$1</u>",
            "/\[i\](.*)\[\/u\]/" => "<i>$1</i>",
            "/\[d\](.*)\[\/d\]/" => "<del>$1</del>",
            "/\[url=(.*)\](.*)\[\/url\]/" => "<a href='$1'>$2</a>"
              );

Это работает, когда каждый bbcode используется только один раз, например ::10000

[b]this text is bold[/b]
[i]this text is italic[/i]
etc..

Но как только я несколько раз использую один тег bbcode, он портится:

   [b]this text is bold[/b]
   [i]this text is italic[/i]
   [b]this text is bold too[/b]

Он увидит первый тег [b] и будет искать другой тег [/ b], но он возьмет последний вместо первого, с которым встречается (в приведенном выше примере весь текст будет выделен жирным шрифтом, а первый - [b] ] и последний [/ b] будет заменен только). Кто-нибудь знает, что я сделал не так и как я могу это исправить?

Спасибо заранее!

Приветствие.

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Вам нужно использовать не жадные символы подстановки вместо всех .* write .*?.

0 голосов
/ 04 февраля 2016

Почему вы не используете BBCode Parser? Посмотрите на NBBC Parser.

Чтобы установить его, просто поместите его в полезную папку на вашем сервере и подключите его, как написано в ссылке, которую я предоставил позже:)

<?php
    require_once("nbbc.php");
    $bbcode = new BBCode;
    print $bbcode->Parse("[i]Hello, World![/i]  This is the magic of [b]BBCode[/b]!");
?>
...