Geshi i funckja preg_replace()

Kategoria: Javascript, HTML i CSS



Elektryk
22 sierpień 2009 - 13:14
Ostatnio bawię się Geshi i chcę w PHP zrobić funkcje która by kolorowała treść z znaczników <code>: Napisałem taki provider treści dla ajaxu:

<?php session_start(); include('database.php'); include_once 'geshi/geshi.php'; $q = str_replace('"', '"' ,$_POST['q']); $q = str_replace('wpis', '' ,$q); $uchwytzapytanie = mysql_query ('select tresc from blog_wpisy where id = "'.$q.'"'); $rekord = mysql_fetch_array($uchwytzapytanie); function kolorowanie($type, $text){ return geshi_highlight($text, $type, "/geshi/".$type.".php"); } $rekord['tresc'] = preg_replace("/<code ref=\"(.*?)\">(.*)</code>/e", "kolorowanie('1', '2')", $rekord['tresc']); echo $rekord['tresc']; ?>

Niestety wyskakuje błąd:

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ... on line 14



Jakieś pomysły?
meverone
22 sierpień 2009 - 20:55
$rekord['tresc'] = preg_replace("/<code ref=\"(.*?)\">(.*)</code>/e", "kolorowanie('$1', '$2')", $rekord['tresc']);

takie coś próbuj :P
Elektryk
22 sierpień 2009 - 21:59
Niestety nie pomaga. Te "c" zacytowane w błędzie pochodzi z napisu "code". Nie trzeba więc jakoś zaznaczyć, że tu chodzi o zwykły tekst a nie o instrukcję?
meverone
22 sierpień 2009 - 22:10
Sorry mój błąd i nie dopatrzenie :)

$text = '<code ref="python">cos tam pokolorowac śłasęłśłą</code>'; function kolorowanie($type, $co){ echo "type: $type | kolorujemy: $co"; } $rekord = preg_replace("#<code ref=\"(.*?)\">(.*)</code>#is", "kolorowanie('$1','$2');", $text); eval($rekord);
Elektryk
22 sierpień 2009 - 22:41
Trochę pozmieniałem i teraz wygląda to tak:
<?php session_start(); include('database.php'); include_once 'geshi/geshi.php'; if(!empty($_GET['q'])) $q = str_replace('"', '&quot;' ,$_GET['q']); else $q = str_replace('"', '&quot;' ,$_POST['q']); $q = str_replace('wpis', '' ,$q); $uchwytzapytanie = mysql_query ('select tresc from blog_wpisy where id = "'.$q.'"'); $rekord = mysql_fetch_array($uchwytzapytanie); function kolorowanie($type, $text){ $geshi = new GeSHi($text, $type, "geshi/"); $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS, 0); $geshi->start_line_numbers_at(1); return $geshi->parse_code(); } $text = preg_replace("#<code ref=\"(.*?)\">(.*)</code>#is", kolorowanie('$1','$2'), $rekord['tresc']); echo($text); ?>

Niesety chociaż tekst wygląda tak:
<code ref="CSS">
.strony-zakladka{
margin-left: -20px;
float: left;
}
</code>

Lorem ipsum dolor sit amet


to kod nie jest kolorowany. Wiem jednak, że Geshi działa gdyż po przetworzeniu kod prezentuje się tak:

<pre class="1" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> .strony-zakladka{ margin-left: -20px; float: left; } </div></li></ol></pre>

--------------------------------------
--------------------------------------
--------------------------------------

Koniec końców po rozmowie z meverone doszliśmy do takie kodu który działą perfekcyjnie:
<?php session_start(); include('database.php'); include_once 'geshi/geshi.php'; if(!empty($_GET['q'])) $q = str_replace('"', '&quot;' ,$_GET['q']); else $q = str_replace('"', '&quot;' ,$_POST['q']); $q = str_replace('wpis', '' ,$q); $uchwytzapytanie = mysql_query ('select tresc from blog_wpisy where id = "'.$q.'"'); $rekord = mysql_fetch_array($uchwytzapytanie); preg_match("#<code ref=\"(.*?)\">(.*)</code>#is", $rekord['tresc'] , $param); /* $g = new Geshi(text, lang); */ $g = new Geshi($param[2], $param[1]); echo $g->parse_code(); ?>

Jeszcze raz dzięki za pomoc :)
Elektryk
23 sierpień 2009 - 14:33
Hmm..no niestety pośpieszyłem się z słowem "perfekcyjnie" gdyż skrypt ucina tekst znajdujący się poza znacznikami <code>. Z kolei jeśli nie występują znaczniki <code> to wyświetla się piękna lista błędów. Da się coś zrobić czy sytuacja jest beznadziejna?
meverone
23 sierpień 2009 - 15:15
Bo ja tylko podałem Ci skrypt do kolorowania składni znajdującej się w znacznikach <code href="..."></code>. Jak chcesz kolorować tekst tylko w znaczniku <code>, a pozostały nie to trzeba mocno zmodyfikować skrypt :]
Elektryk
23 sierpień 2009 - 16:03
Ok, to sobie dam chyba spokój z tym :/
meverone
23 sierpień 2009 - 19:33
Skrobnąłem bardzo prostą klasę do obsługi znaczników code - powinno Ci to wystarczyć. Może kiedyś bardziej rozbuduje klasę...

<?php require_once 'geshi.php'; class ColorSyntax { public function SearchCode($content) { $content = preg_replace("#\[code lang=\"(.*?)\"\](.*?)\[\/code\]#sie", '$this->PreformBlock("\\1","\\2");', $content); return $content; } public function PreformBlock($lang, $source){ $source = str_replace(array("\\\"", "\\\'"), array ("\"", "\'"), $source); $result = $this->HighlightCode($source, $lang); return $result; } public function ParseCode($content){ return $this->SearchCode($content); } public function HighlightCode($source, $lang ){ $geshi = new GeSHi($source, $lang); $geshi->set_source($source); $result = $geshi->set_language($lang); $result = $geshi->parse_code(); return $result; } } ?>

Przykład użycia:
/* [code lang="php"][/code] - tylko tak działa :) */ $POST = ' PHP: [code lang="php"] echo "a"; function foo(){ echo "bar"; } [/code] Python: [code lang="python"] import urllib2 from random import choice print choice(["1","2"]) [/code] CSS: [code lang="CSS"] .view { font-size: 10px; color:#fff; } [/code] '; $color = new ColorSyntax(); echo $color->ParseCode($POST);
Elektryk
24 sierpień 2009 - 15:10
Działa wybornie :D dzięki za pomoc :)

---

Ekhm...po czasie okazało się, że funkcja zawodzi przy występowaniu cudzysłowów i apostrofów. Pojawiały się zbędne slashe. Nowa wersja by aseeon:
class ColorSyntax { public function SearchCode($content) { $content = preg_replace("#\[code lang=\"(.*?)\"\](.*?)\[\/code\]#sie", '$this->PreformBlock("\\1","\\2");', $content); return $content; } public function PreformBlock($lang, $source){ $source = stripslashes($source); $result = $this->HighlightCode($source, $lang); return $result; } public function ParseCode($content){ return $this->SearchCode($content); } public function HighlightCode($source, $lang ){ $geshi = new GeSHi($source, $lang); $geshi->set_source($source); $result = $geshi->set_language($lang); $result = $geshi->parse_code(); return $result; } }


Podobne tematy:
[PHP] preg_replace, usuwanie komentarzy
preg_replace_callback a klasa
preg_replace i cudzysłów
wyrwżenia regularne-preg_replace
preg_replace
[PHP] preg_replace, zamiana w tablicach