Малък проблем с функцията nl2br

kikity_94

Registered
Здравейте колеги.
Преди малко като си правих работите по проекта ми се натъкнах на нещо което изобщо не ми харесва и не можах да намеря решение.
Значи проблема е следният:
В базата данни въвеждам някаква информация която се въвежда от текстареа, но пък има и bbcode система. Когато извеждам резултата от базата данни и използвам nl2br() висчко се показва по начина по който е записано в текстареата, обаче когато се използва ббкода и по точно имам php syntax highlighter и когато и всичко което е между [code ]php кодът[/ code] мине през функцията добавя на всеки ред тага
HTML:
<br />
Когато махна nl2br всичко м-у code тага се оправя и е точно както искам, но пък останалият текст се реди на 1 ред и това е мн грозно.
Ето и малко код:

PHP:
	function bbcode($bbcode) {	
		$bbcode = htmlspecialchars_decode(stripslashes($bbcode));
                $bbcode = preg_replace("/\[code\](.+?)\[\/code\]/is", "<pre class='brush: php;'>$1</pre>", $bbcode);
                
                 return $bbcode;	
        }

И вече като извеждам

PHP:
<?php echo bbcode($row['poleto']); ?>

Ако е от значение кой syntax highlighter ползам, той е на alexgorbatchev
 
Ето какво намерих в php.net за highlighter - а:

http://php.net/manual/en/function.highlight-string.php

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

PHP:
function showCode($code) {
 $code = highlight_string($code, true);
 $code = explode("<br />", $code);
 
 $i = "1";
 foreach ($code as $line => $syntax) {
  echo "<font color='black'>".$i."</font> ".$syntax."<br>";
  $i++;
 }
}
 
eddyy93 каза:
Ето какво намерих в php.net за highlighter - а:

http://php.net/manual/en/function.highlight-string.php

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

PHP:
function showCode($code) {
 $code = highlight_string($code, true);
 $code = explode("<br />", $code);
 
 $i = "1";
 foreach ($code as $line => $syntax) {
  echo "<font color='black'>".$i."</font> ".$syntax."<br>";
  $i++;
 }
}

С тотзи вариянт съм пробвал още преди да мина към готовият highlighter при този имам много проблеми на които просто не мога да намеря решение.

А записването в базата не знам от какво значение е, но записвам някакъв текст редове примерно и после в ббкод може да се сложи някакъв php код и после пак редове с текст. Проблема е там, че когато ползвам nl2br() за цялото поле то тогава nl2br() прецаква това което е м-у ббкод тага съотвено някакъв php код, а когато го махна се оправя, но пък текста се прецаква тогас е не мгоа да измисля как да направя цялото поле да ползва nl2br но точно при този ббкод таг да го премахва. Аз имам и доста други ббкодове попринцип, но с тях нямам проблем
 
Ето така би трябвало да работи:

Може би има по елегантен начин чрез regex да се направи този код.

При explode [ code] и [ /code], изтрии празното пространство от пред, направил съм го така, защото се бърка със функциите на този форум.

PHP:
function bbcode($bbcode) {      
                $bbcode = htmlspecialchars_decode(stripslashes($bbcode));

                if(preg_match("/\[code\](.+?)\[\/code\]/is", $bbcode)) {
                     
                               
                    
                $first = explode ('[ code]', $bbcode); //iztrii praznoto prostranstvo
                $second = explode ('[/ code]', $first[1]); //iztrii praznoto prostranstvo
                
                $TheCode = preg_replace('/<br(\s+)?\/?>/i', "\n", $second[0]);                
                $TheCode = "<pre class='brush: php;'>".$TheCode."</pre>";
                
                $bbcode = $first[0].$TheCode.$second[1];
                
                                             
                }
               
               
                
                return $bbcode;
                         
        }
 

Back
Горе