PHP проверка за съвпадащи тагове в съдържание, изпратено от потребителя

Събрах свой собствен специално създаден форум, използвайки PHP, и се развива удивително, но се опитвах да разбера дали има начин да проверя за съвпадение на BBCode тагове? Имам свои собствени масиви, настроени да заменят <b> с [b] и т.н., но искам да съм сигурен, че таговете ще бъдат затворени в даден момент [/b] и няма да продължат да изтичат от публикацията и върху останалата част страница.

Например: [b]This is text ще се покаже като [b]This is text, а [b]This is text[/b] ще се върне на страницата като <b>This is text</b>

Има ли начин да направите това или има начин в PHP/HTML да „избягате“ всички отворени тагове? IE; ако в публикацията няма [/b], автоматично добавете </b> в края й.


person Community    schedule 11.10.2014    source източник
comment
snipplr.com/view/3618 htmlpurifier.org stackoverflow.com/questions/3810230/   -  person honzahommer    schedule 11.10.2014


Отговори (2)


това е много прост анализатор на bbcode за вашите изисквания:

function bbcode($data)
{
    $input = array(
        '/\[b\](.*?)\[\/b\]/is',
        '/\[b\](.*?)$/',
    );
    $output = array(
        '<b>$1</b>',
        '<b>$1</b>',
    );
    return preg_replace ($input, $output, $data);;
}

няколко примера:

bbcode('[b]text[/]');
//returns <b>text</b>

bbcode('[b]text');
//returns <b>text</b>

Вижте примера за изпълнение тук

person rogelio    schedule 11.10.2014
comment
само коментар, за други тагове трябва да направите същото, със същия регулярен израз. - person rogelio; 11.10.2014

Така че тук искате да анализирате BBCode тагове с HTML тагове, ето една малка функция, която намерих в мрежата, която може да ви свърши работата доста лесно

<?php

/* Simple PHP BBCode Parser function */

//BBCode Parser function

function showBBcodes($text) {

// BBcode array
$find = array(
'~\[b\](.*?)\[/b\]~s',
'~\[i\](.*?)\[/i\]~s',
'~\[u\](.*?)\[/u\]~s',
'~\[quote\](.*?)\[/quote\]~s',
'~\[size=(.*?)\](.*?)\[/size\]~s',
'~\[color=(.*?)\](.*?)\[/color\]~s',
'~\[url\]((?:ftp|https?)://.*?)\[/url\]~s',
'~\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp))\[/img\]~s'
);

// HTML tags to replace BBcode
$replace = array(
'<b>$1</b>',
'<i>$1</i>',
'<span style="text-decoration:underline;">$1</span>',
'<pre>$1</'.'pre>',
'<span style="font-size:$1px;">$2</span>',
'<span style="color:$1;">$2</span>',
'<a href="/bg$1">$1</a>',
'<img src="$1" alt="" />'
);

// Replacing the BBcodes with corresponding HTML tags
return preg_replace($find,$replace,$text);
}

// How to use the above function:

$bbtext = "This is [b]bold[/b] and this is [u]underlined[/u] and this is in [i]italics[/i] with a [color=red] red color[/color]";
$htmltext = showBBcodes($bbtext);
echo $htmltext;

?>
person rsakhale    schedule 11.10.2014
comment
това не е отговорът, който @TheElm търси. Той казва, че ако bbcode не е затворен, добавете съответния затварящ таг в края - person rogelio; 11.10.2014
comment
Регулярният израз от това е наистина полезен, заедно с отговора на rogello, за да затвори маркерите, след като бъде затворен. Благодаря за отговора! - person ; 11.10.2014