Parser BBCodu v PHP

PHP Ostatní Parser BBCodu v PHP

Jednoduchý skript, který převede BBCode tagy v textu na HTML tagy. Skript využívá regex a je tedy dobré ho ovládat.

Skript byl vytvořen pro soutěž Machr na PHP - Parser BB kódu


Galerie

Program byl vytvořen v roce 2013.

 

Stáhnout

Staženo 154x (3.55 kB)
Aplikace je včetně zdrojových kódů v jazyce php

 

  Aktivity (1)

Program pro vás napsal Zdeněk Bauer
Avatar
Autor se věnuje převážně PHP s frameworkem Nette, ale neštítí se ani C# a Javy.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
Ostatní tutoriály v PHP
Miniatura
Následující článek
Šablonovací systém PHP_JUI - Úvod

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:

Když je program krátký, dá se vložit přímo do textu:

<!DOCTYPE html>
<html lang='cs'>
<head>
<title></title>
<meta charset='utf-8'>
</head>
<body>
<?php
/*
 * Autor: zdenda204
 * Datum: 16.12.2013 12:40
 */
function preloz($text) {

    // Pole pro vyhledání BBCode tagů.
    $bbcode = array(
        '~\[b\](.*?)\[/b\]~s',
        '~\[i\](.*?)\[/i\]~s',
        '~\[u\](.*?)\[/u\]~s',
        '~\[url\]((?:ftp|https?)://.*?)\[/url\]~s',
        '~\[color=(.*?)\](.*?)\[/color\]~s',
        '~\[size=(.*?)\](.*?)\[/size\]~s',
        '~\[img\](https?://.*?\.(?:jpg|gif|png))\[/img\]~s',
        '(:\)(?!\)))',
        '(:\((?!\)))'
    );

    // Pole s HTML tagy kterými se BBCode tagy přepíší.
    $htmlcode = array(
        '<b>$1</b>',
        '<em>$1</em>',
        '<u>$1</u>',
        '<a href="$1">$1</a>',
        '<span style="color:$1;">$2</span>',
        '<span style="font-size:$1px;">$2</span>',
        '<img src="$1" alt="" />',
        '<img src="./smile.png" alt="Šťastný" />',
        '<img src="./sad.png" alt="Smutný" />'
    );

    // Funkce která najde a přepíše BBCody v určitém stringu.
    return preg_replace($bbcode,$htmlcode,$text);
}

//Příklad
$bbtext = "Toto je [b]zvýraznéný[/b], toto je [u]podtrhnutý[/u] a toto je styl [i]italic[/i]. Když se odřu, teče mi [color=orange]oranźová krev[/color] a jseme smutný :(. Ale kdybych vyhrál, byl bych šťastný :)";
$htmltext = preloz($bbtext);
echo $htmltext;
?>
</body>
</html>
Editováno 24.12.2013 11:03
Odpovědět 24.12.2013 11:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Zdeněk Bauer
Redaktor
Avatar
Odpovídá na Kit
Zdeněk Bauer:

Díky, tak pro příště to vím :)
Teď už to editovat je nejspíše zbytečný když kód jsi sem vložil :)

 
Odpovědět 24.12.2013 11:08
Avatar
Kit
Redaktor
Avatar
Odpovídá na Zdeněk Bauer
Kit:

Nechal jsem ho i automaticky odsadit editorem, aby to vypadalo lépe. Jinak jsem s tím nic nedělal.

Odpovědět 24.12.2013 11:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

Ovšem co to udělá s tímto například:

Toto je [b]zvýra[b]zvýraznéný[/b]znéný[/b]

EDIT: Vím je to detail.. :D

Editováno 24.12.2013 11:20
Odpovědět 24.12.2013 11:18
Chybami se člověk učí, běžte se učit jinam!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Marek Z.
Kit:

Také koukám, že se ten regulární výraz nechová hladově, jak bych očekával.

Odpovědět 24.12.2013 11:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Zdeněk Bauer
Kit:

Zkusil jsem jedno pole vypustit. Chová se to stejně, ale program je o něco robustnější.

<!DOCTYPE html>
<html lang='cs'>
<head>
<title></title>
<meta charset='utf-8'>
</head>
<body>
<?php
/*
 * Autor: zdenda204
 * Datum: 16.12.2013 12:40
 * Upravil: Kit
 */
function preloz($text) {

    // Pole pro vyhledání BBCode tagů.
    // s HTML tagy kterými se BBCode tagy přepíší.
    $bbcode = array(
        '~\[b\](.*?)\[/b\]~s' => '<b>$1</b>',
        '~\[i\](.*?)\[/i\]~s' => '<em>$1</em>',
        '~\[u\](.*?)\[/u\]~s' => '<u>$1</u>',
        '~\[url\]((?:ftp|https?)://.*?)\[/url\]~s' => '<a href="$1">$1</a>',
        '~\[color=(.*?)\](.*?)\[/color\]~s' => '<span style="color:$1;">$2</span>',
        '~\[size=(.*?)\](.*?)\[/size\]~s' => '<span style="font-size:$1px;">$2</span>',
        '~\[img\](https?://.*?\.(?:jpg|gif|png))\[/img\]~s' => '<img src="$1" alt="" />',
        '(:\)(?!\)))' => '<img src="./smile.png" alt="Šťastný" />',
        '(:\((?!\)))' => '<img src="./sad.png" alt="Smutný" />',
    );

    // Funkce která najde a přepíše BBCody v určitém stringu.
    return preg_replace(array_keys($bbcode), $bbcode, $text);
}

//Příklad
echo preloz(<<<EOT
Toto je [b]zvýraznéný[/b], toto je [u]podtrhnutý[/u] a toto je styl [i]italic[/i]. Když se odřu, teče mi [color=orange]oranźová krev[/color] a jseme smutný :(. Ale kdybych vyhrál, byl bych šťastný :)
EOT
);
echo preloz("Toto je [b]zvýra[b]zvýraznéný[/b]znéný[/b]");
?>
</body>
</html>
Odpovědět 24.12.2013 11:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Kit
Marek Z.:

Ano, proto jsem to řešil přes while v machrovi. Kdyby se to dalo do objektivu tak by to byl dle mého názoru celkem slušní univerzál..

Kolikrát jsem se dočetl, že se prostě používá na tento problém 'preg_match_all'.

Odpovědět 24.12.2013 12:03
Chybami se člověk učí, běžte se učit jinam!
Avatar
Marek Z.
Redaktor
Avatar
Marek Z.:

Můžeš ještě použít modifikátor, konkrétně U. Ale ten ti zajistí, že ti to zakončí a né to, že ti vezme první zakončovací.

Resp.:

Toto je [b]zvýra[b]zvýraznéný[/b]znéný[/b]
Toto je <b>zvýra[b]zvýraznéný</b>znéný[/b] //Bez modifikátoru U
Toto je <b>zvýra[b]zvýraznéný[/b]znéný</b> //S modifikátorem U
Editováno 24.12.2013 12:09
Odpovědět 24.12.2013 12:06
Chybami se člověk učí, běžte se učit jinam!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Marek Z.
Kit:

Zase to pak blbne u tohoto:

Toto je [b]zvýra[/b]zvýraznéný[b]znéný[/b]
Odpovědět 24.12.2013 12:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Kit
Marek Z.:

Zkrátka, pokud chceš vyřešit tento problém, tak to musíš projet tolikrát, kolikrát se prostě vyskytuje ten párový tag..

Kdežto u tohoto řešení to v podstatě projedeš jen jednou.

Odpovědět 24.12.2013 12:17
Chybami se člověk učí, běžte se učit jinam!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.