Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] jak podmienić fragment string'a?
Forum PHP.pl > Forum > PHP
Blackmoore
Witam, mam pytanie. W jaki sposób mogę najpierw znaleźć fragmenty string'a znajdujące się pomiędzy "[c++]" i "[/c++] i podmienić je na pokolorowaną składnię? Chcę skorzystać z GeSHi.

Przykład:
$string = "ala ma [c++]cout<<kota;[/c++] i lubi [c#]mleko[/c#]";

wywołanie GeSHI:
$geshi = new GeSHi($source, $language); //koloruje $source
echo $geshi->parse_code();
Blackmoore
Wielkie dzięki, przydała się ta funkcja. Napisałem taki skrypt:
  1. include("geshi/geshi.php");
  2. if (isset($_POST['content'])) {
  3. $content = stripslashes($_POST['content']);
  4. $output = parseTagsRecursive($content);
  5.  
  6. echo $output;
  7. }
  8. else {
  9. echo '<b><i style="color: #A0A0A0;">Press the "Preview" button.</i></b>';
  10. }
  11. function parseTagsRecursive($input)
  12. {
  13.  
  14. $regex = '#\[cpp]((?:[^[]|\[(?!/?cpp])|(?R))+)\[/cpp]#';
  15.  
  16. if (is_array($input)) {
  17. $geshi = new GeSHi($input[1], 'cpp');
  18. $input[1] = $geshi->parse_code();
  19. $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
  20. }
  21.  
  22. return preg_replace_callback($regex, 'parseTagsRecursive', $input);
  23. }

Tylko co muszę zrobić, żeby obsługiwało większą liczbę języków, tak jak tutaj na forum (słabo znam się na wyrażeniach regularnych)?
nospor
Pierwszy parametr może być wyrażeniem regularnym (tak jak masz teraz) lub tablicą wyrażen (to co cię własnie powinno zainteresować) smile.gif
Blackmoore
Rozumiem, pomysł ale nie radze sobie z implementacją, próbowałem tak to rozwiązać:
  1. function parseTagsRecursive($input)
  2. {
  3.  
  4. $regex['cpp'] = '#\[cpp]((?:[^[]|\[(?!/?cpp])|(?R))+)\[/cpp]#';
  5. $regex['css'] = '#\[css]((?:[^[]|\[(?!/?css])|(?R))+)\[/css]#';
  6. foreach($regex as $key => $value)
  7. {
  8. if (is_array($input)) {
  9. $geshi = new GeSHi($input[1], $key);
  10. $input[1] = $geshi->parse_code();
  11. $input[1] = str_replace('&lt;','',$input[1]); // usuwa <
  12. $input[1] = str_replace('br','',$input[1]); // usuwa br
  13. $input[1] = str_replace('&gt;','',$input[1]); // usuwa >
  14. $input[1] = str_replace('&amp;nbsp;','',$input[1]); // usuwa zbedne spacje
  15. $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
  16. }
  17. return preg_replace_callback($regex[$key], 'parseTagsRecursive', $input);
  18. }
  19. }

ale ten return trochę wadzi, co musiałbym zmodyfikować? Czy w zupełnie zły sposób do tego podchodzę?
nospor
No nie zrozumiales... Nadal do preg_replace przekazujesz string. Masz przekazac tablice, bez zadnej petli, cos ala:

  1. $regex = array(
  2. '#\[cpp]((?:[^[]|\[(?!/?cpp])|(?R))+)\[/cpp]#',
  3. '#\[css]((?:[^[]|\[(?!/?css])|(?R))+)\[/css]#'
  4. );
  5.  
  6. ///.....
  7. preg_replace_callback($regex, 'parseTagsRecursive', $input);
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.