Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja w preg_replace()
Forum PHP.pl > Forum > Przedszkole
Fishu
Witam, zainstalowałem Geshi na stronie, i chcę aby zamieniało podany kod na funkcję, tzn.
Chcę zamienić <div class='artCode' id='html'>Tekst w listingu</div> (gdzie jako html, dowolny język do zakolorowania). Mam taki kod:
  1. <?php
  2. function color($type, $text)
  3. {
  4.            
  5. $geshi = new GeSHi($text, $type);
  6. $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS, 0);
  7. $geshi->start_line_numbers_at(1);
  8. echo $geshi->parse_code();
  9.            
  10. }
  11. preg_replace('#<div id="artCode" type="([a-z]+)">(.*?)</div>#', color("1", "2"), $array[text]);
  12. ?>

Utworzyłem nową funkcję color(), ponieważ chciałem użyć paru ustawień dla geshi. Niby wszystko jest ok, ale wywołuje funkcję ze złymi parametrami color("\\1", "\\2"). Jest jakaś możliwość, by wywoływało funkcję, z parametrami określonymi w <div [..]>[..]</div> ?
erix
Po pierwsze: nie echo" title="Zobacz w manualu PHP" target="_manual a return" title="Zobacz w manualu PHP" target="_manual w funkcji kolorującej.
Po drugie: wywołanie funkcji w preg_replace" title="Zobacz w manualu PHP" target="_manual dajesz w cudzysłowach.
Po trzecie: dodaj modyfikatory we wzorcu, zwłaszcza e, który informuje interpreter, że zamiennik, to wywołanie funkcji.
Fishu
Dzięki, znalazłem to wcześniej ale zapomniałem napisać. Jednak oprócz tego rodzi się inny problem. Gdy używam return (aktualnie korzystam z funkcji geshi, geshi_highlight()) to niestety zwraca listingi na początek tekstu i ich nie koloruje.
  1. <?php
  2. function color($type, $text)
  3. {
  4.                return geshi_highlight($text, $type, "/geshi/".$type.".php");
  5.            
  6. }
  7. $array[text] = preg_replace("/<div class=\"artCode\" id=\"(.*?)\">(.*)</div>/e", "color('1', '2')", $array[text]);
  8. ?>
Jakieś pomysły ? przykładowy listing, który ma być zamieniony <div class="artCode" id="html">Treść listingu</div>
erix
Cytat
to niestety zwraca listingi na początek tekstu i ich nie koloruje.

Tzn? Mógłbyś pokazać kod po przekształceniu? Poza tym, z tego, co się orientuję, to zwracany tekst powinien być również objęty poszukiwanymi znacznikami (tzn. div class).

Tak nawiasem, powinieneś użyć innego atrybutu dla rozróżnienia języka; id musi być unikalne.

  1. <?php
  2. $array[text]
  3. ?>

Masz stałą text?
Elektryk
Również ostatnio bawię się Geshi i tak jak autor ematu chcę zrobić taką funckje. Wykorzystałem jego kod i napisałem takie coś:

  1. <?php
  2. include('database.php');
  3. include_once 'geshi/geshi.php';
  4.  
  5. $q = str_replace('"', '"' ,$_POST['q']);
  6. $q = str_replace('wpis', '' ,$q);
  7. $uchwytzapytanie = mysql_query ('select tresc from blog_wpisy where id = "'.$q.'"');
  8. $rekord = mysql_fetch_array($uchwytzapytanie);
  9.  
  10. function color($type, $text)
  11. {
  12. return geshi_highlight($text, $type, "/geshi/".$type.".php");
  13. }
  14. $rekord['tresc'] = preg_replace("/<code ref=\"(.*?)\">(.*)</code>/e", "color('1', '2')", $rekord['tresc']);
  15.  
  16. echo $rekord['tresc'];
  17. ?>


Niestety wyskauje błąd:
Cytat
Warning: preg_replace() [function.preg-replace]: Unknown modifier 'c' in ... on line 15


Jakieś pomysły?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.