NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Funkce, kterou se snažíš použít je dostupná pouze pro registrované uživatele. Buďto se přihlas nebo si zdarma vytvoř nový účet.
Funkce, kterou se snažíš použít je dostupná pouze pro registrované uživatele. Buďto se přihlas nebo si zdarma vytvoř nový účet.

Diskuze – Parser BBCodu v PHP

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Kit
Tvůrce
Avatar
Kit:24.12.2013 11:02

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
Tvůrce
Avatar
Odpovídá na Kit
Zdeněk Bauer:24.12.2013 11:08

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
Tvůrce
Avatar
Odpovídá na Zdeněk Bauer
Kit:24.12.2013 11:13

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
Uživatel sítě :24.12.2013 11:18

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Kit:24.12.2013 11:30

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
Tvůrce
Avatar
Odpovídá na Zdeněk Bauer
Kit:24.12.2013 11:40

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
Odpovídá na Kit
Uživatel sítě :24.12.2013 12:03

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
Uživatel sítě :24.12.2013 12:06

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
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Kit:24.12.2013 12:14

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
Odpovídá na Kit
Uživatel sítě :24.12.2013 12:17

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.