Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] jak podmienić fragment string'a?
Blackmoore
post 4.10.2010, 22:43:08
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 22.08.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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();

Ten post edytował Blackmoore 4.10.2010, 22:43:41
Go to the top of the page
+Quote Post
nospor
post 5.10.2010, 06:17:02
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




http://pl.php.net/manual/pl/function.preg-...ce-callback.php


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Blackmoore
post 5.10.2010, 10:21:43
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 22.08.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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)?
Go to the top of the page
+Quote Post
nospor
post 5.10.2010, 10:57:24
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Blackmoore
post 6.10.2010, 12:08:42
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 22.08.2009
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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ę?
Go to the top of the page
+Quote Post
nospor
post 6.10.2010, 12:12:45
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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);


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2025 - 04:12