Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: coś a'la bbcode i highlight_string
Forum PHP.pl > Forum > PHP
Strarus
cześć smile.gif

W jaki sposób mogę zrobić coś a'la bbcode z kolorowaniem składni za pomocą highlight_string questionmark.gif
Mephistofeles
Wyrażenia regularne -> i odpowiednie stylowanie elementu w zależności od zawartości.
Strarus
no tal i np. preg_replace i jak to zrobić? bo mam:

  1. <?php
  2. preg_replace("#[php](.*?)
  3. ?>
#",### co tu? ###, $content);[/php]

chodzi mi o coś takiego jak użyłem przed chwilą smile.gif czyli [php*][/php*] bez * oczywiście biggrin.gif
tylko nie wiem jak to napisać?
Mephistofeles
Nie znam się na wyrażeniach regularnych, ale musisz dla każdego elementu zrobić coś w stylu: po znalezieniu znaku $ idź aż do spacji i obejmij wszystko w <span class="variable"></span> itp.
Strarus
Tak, tylko w jaki sposób zrobić tą klasę? Ponieważ css to chyba nie dla php haha.gif Tutaj trzeba zastosować highlight_string(), tylko nie wiem jak!?

edit: ew. jak zrobić "to co pomiędzy
  1. <?php
  2. , a
  3. ?>
dodaj do zmiennej $zmienna smile.gif
kamil4u
Nie za bardzo rozumiem probelmu:
- wyrażenie regularne, które wyciągnie wszystko pomiędzy [ph p] i [/ph p]:
Kod
#[php](.*)[\/php]#Usi
<-- nie pamiętam czy przed [ i ] nie trzeba dać przypadkiem \
- i wynik wsadzasz do funkcji highlight_string()

Do twojego kodu: w preg_replace nie można użyć funkcji PHP - poczytaj o: preg_replace_callback" title="Zobacz w manualu PHP" target="_manual - dalej to sobie chyba poradzisz smile.gif
Mephistofeles
LOL źle przeczytałem pierwszy post. Myślałem, że chcesz zrobić coś podobnego do highlight_string. Post wyżej zobacz - masz odpowiedź na twój problem.
Strarus
Hmm... już się męczę nad tym dość długo i nic mi nie przychodzi do głowy - nie mogę zrozumieć tego [b]preg_replace_callback() [/b]?
.radex
preg_replace_callback zamienia wartości X na Y według wyrażeń regularnych tak jak preg_replace, z tym, że w preg_replace Y jest stringiem (np. "costam \\1 foo \\2 bar"), a w preg_replace_callback wartości są przekazywane do jakiejś funkcji, której nazwa jest w tym stringu (callback), czyli np. "foo" wywoła funkcję foo(...){}

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

tu masz wszystko w przykładach - łatwiej zrozumieć.
Strarus
dzięki, troszkę mi teraz lepiej smile.gif zaraz popróbuję smile.gif

edit: niestety - nie udało mi się nic napisać sad.gif jeśli ktoś by miał zbędny kod, to chętnie skorzystam smile.gif
kamil4u
Pokaż nam swoje próby - forum jest od pomagania w rozwiązywaniu problemów, tak więc my spróbujemy Cię odpowiednio nakierować/poprawić Twoje błędy smile.gif - czekam na Twoją propozycję kodu
Strarus
no więc:

  1. <?php
  2. // this text was used in 2002
  3. // we want to get this up to date for 2003
  4. $text = "April fools day is [ph p]
  5. asdasd
  6. ?>[/ph p]";
  7. $content = preg_replace("#[ph p]
  8. <?php
  9. (.*?)
  10. ?>[/ph p]#", '<code>1</code>', $text);
  11. echo ($content);
  12. echo '<br/><br/><br/>';
  13.  
  14. // the callback function
  15. function replace_php($matches)
  16. {
  17.  return highlight_string($matches[1]);
  18. }
  19.            "#[ph p]
  20. <?php
  21. (.*?)
  22. ?>[/ph p]#",
  23.            "replace_php",
  24.            $text);
  25.  
  26. ?>


i się pokazuje:

April fools day is [ph p] asdasd [/ph p]


April fools day is [ph p] asdasd [/ph p]

proszę bardzo smile.gif
.radex
Cytat(Strarus @ 15.03.2009, 00:11:22 ) *
i się pokazuje:

April fools day is [ph p] asdasd [/ph p]
April fools day is [ph p] asdasd [/ph p]

proszę bardzo smile.gif


bo wymagasz, żeby zamieniało

[ph p]
<?php
cokolwiek
?>
[/ph p]

na <code>cokolwiek</code>

a nie powinno być przypadkiem

[ph p]cokolwiek[/ph p]

hm?
Strarus
no więc nakodziłem coś takiego:

  1. <?php
  2.  
  3. $code = "test [ph p]echo 'hello world!';[/ph p] test";
  4.  
  5. function bbcode_php($code) {
  6.  
  7.    $wzorzec = "#[ph p](.*?)[/ph p]#";
  8.    
  9.    if(is_array($code)) {
  10.      
  11.       $code = '<div style="border: 1px green solid">'.$code[1].'</div>';
  12.      
  13.    }
  14.    
  15.    return preg_replace_callback($wzorzec, 'bbcode_php', $code);
  16.  
  17. }
  18.  
  19. $output = bbcode_php($code);
  20.  
  21. echo ($output);
  22.  
  23. ?>


ładnie się wyświetla ale nie mogę dodać funkcji highlight_string() bo wtedy wszystko się wali ! jak teraz dodać kolorowanie?
erix
Pokaż, jak ten highlight_string" title="Zobacz w manualu PHP" target="_manual dodawałeś.
Strarus
  1. <?php
  2.  
  3. $code = "test [ph p]echo 'hello world!';[/ph p] test";
  4.  
  5. function bbcode_php($code) {
  6.  
  7.    $wzorzec = "#[ph p](.*?)[/ph p]#";
  8.    
  9.    if(is_array($code)) {
  10.      
  11.       $code = '<div style="border: 1px green solid">'.highlight_string($code[1]).'</div>';
  12.      
  13.    }
  14.    
  15.    return preg_replace_callback($wzorzec, 'bbcode_php', $code);
  16.  
  17. }
  18.  
  19. $output = bbcode_php($code);
  20.  
  21. echo ($output);
  22.  
  23. ?>
erix
A co konkretniej ten kod kisi? IMHO nie powinno się to wywoływać rekurencyjnie...
Strarus
No więc gdzie to dać? smile.gif Bo to najważniejsze smile.gif
.radex
no coś w tym stylu:

function foo($data)
{
return pokoloruj_i_co_tam_jeszcze_chceta(...);
}

preg_re..callback("[ph ... [/ph p]", "foo", $zmienna_z_kodem_w_bbcode);
Strarus
Trochę Cie nie zrozumiałem ale dzięki temu wpadłem na coś takiego:
  1. <?php
  2. $code = "test [ph p]< ? php echo 'hello world!'; ? >[/ph p] test";
  3.  
  4. function bbcode_php($code) {
  5.  
  6.    $wzorzec = "#[ph p](.*?)[/ph p]#";
  7.    
  8.    if(is_array($code)) {
  9.      
  10.       $zmienna = highlight_string($code[1]);
  11.      
  12.       $code = '<div style="border: 1px green solid">'.$zmienna.'</div>';
  13.      
  14.    }
  15.    
  16.    return preg_replace_callback($wzorzec, 'bbcode_php', $code);
  17.  
  18. }
  19.  
  20. $output = bbcode_php($code);
  21.  
  22. echo ($output);
  23. ?>


Niestety teraz wyświetla się tak:

<?php echo 'hello world!'; ?> test 1 test

sad.gif

ps. tylko ta 1 jest w zielonej ramce
.radex
  1. <?php
  2. $code = "test [ph p]< ? php echo 'hello world!'; ? >[/ph p] test";
  3.  
  4. function bbcode_php($code) {
  5.  
  6.    
  7.    if(is_array($code)) {
  8.      
  9.       $zmienna = highlight_string($code[1]);
  10.      
  11.       $code = '<div style="border: 1px green solid">'.$zmienna.'</div>';
  12.      
  13.    }
  14.   return $code;
  15. }
  16.  
  17. //$output = bbcode_php($code);
  18.  
  19.    
  20.    $wzorzec = "#[ph p](.*?)[/ph p]#";
  21.    $output = preg_replace_callback($wzorzec, 'bbcode_php', $code);
  22.  
  23. echo ($output);
  24. ?>


coś w tym stylu. powinno działać.

(tylko uporządkuj to ładnie, ja to tylko tak na szybko)
Strarus
dzięki bardzo smile.gif w razie czego napisze jeszcze smile.gif

edit: no niestety efekt identyczny z moim sad.gif może jakaś inna metoda haha.gif??
.radex
Zapomniałem, że przed nawiasami kwadratowymi stawiamy backslash (no chyba, że chcemy uzyskać to co dają nam one bez backslashy).

wzorzec powinien wyglądać tak: "#\[ph p\](.*?)\[/ph p\]#"
Strarus
a ja zapomniałem wspomnieć, że to poprawiłem haha.gif niestety to nie był problem sad.gif nadal jest w takiej dziwnej formie ten tekst...
bim2
nie, źle zrozumiałeś.
  1. <?php
  2. function phphigh($math)
  3. {
  4. //...
  5. }
  6. function bbcode_php()
  7. {
  8. return preg_replace_callback($wzorzec, 'phphigh', $code);
  9. }
  10. ?>
Strarus
a co ma robić phphigh ? i w ogóle jak to ma się wykonywać?

bo na chwilę obecną mam coś takiego:
  1. <?php
  2.  
  3. $code = "test [ph p]echo 'hello world!';[/ph p] test";
  4.  
  5. function bbcode_php($code) {
  6.  
  7.   $wzorzec = "#[ph p](.*?)[/ph p]#";
  8.  
  9.   if(is_array($code)) {
  10.    
  11.      $code = '<div style="border: 1px green solid">&lt?php<br/> '.$code[1].' <br/>?&gt</div>';
  12.      
  13.    
  14.   }
  15.  
  16.   return preg_replace_callback($wzorzec, 'bbcode_php', $code);
  17.  
  18. }
  19.  
  20. $output = bbcode_php($code);
  21.  
  22. echo ($output);
  23.  
  24. ?>


składniowo jest tak jak trzeba (tekst niżej border z kodem niżej tekst) ale nie ma highlight sad.gif
bim2
Czytaj i analizuj.

<?php
function phphigh($math)
{
//...
}
function bbcode_php()
{
return preg_replace_callback($wzorzec, 'phphigh', $code);
}
?>[/php]
do phphight wrzucasz funkcje kolorujaca i zwracasz pokolorowany kod, a w bbcode_php tylko preg_replace_callback
Strarus
napisałem coś takiego i nic się nie pokazuje na stronie (biała)
  1. <?php
  2.  
  3. $code = "test [ph p]echo 'hello world!';[/ph p] test";
  4.  
  5. function phphigh($code) {
  6.  
  7.     if(is_array($code)) {
  8.    
  9.      $code = '<div style="border: 1px green solid">&lt;?php<br/> '.$code[1].' <br/>?&gt;</div>';
  10.    
  11.   }
  12.  
  13. return ($code);  // I z tym i bez tego nie działa
  14.  
  15. }
  16.  
  17. function bbcode_php() {
  18.  
  19.  $wzorzec = "#[ph p](.*?)[/ph p]#";
  20.  
  21.  return preg_replace_callback($wzorzec, 'phphigh', $code);
  22.  
  23. }
  24.  
  25. $output = bbcode_php($code);
  26.  
  27. echo ($output);
  28.  
  29. ?>
bim2
Nie działa czyli co się dzieje? pomyśl czemu nie koloruje? Nie wrzuciłeś funkcji kolorującej do php_high() smile.gif Jak dobrze wrzucisz, wszystko będzie Ok
Strarus
Nie działa w ogóle, to znaczy wyświetla się biała strona. Chciałem sprawdzić czy w ogóle mi takie rozwiązanie zadziała, a potem wrzucić hihglight. Teraz też nie działa, oto kod:
  1. <?php
  2.  
  3. $code = "test [ph p]echo 'hello world!';[/ph p] test";
  4.  
  5. function phphigh($code) {
  6.  
  7.    if(is_array($code)) {
  8.      
  9.      $kod = highlight_string($code[1]);
  10.  
  11.     $code = '<div style="border: 1px green solid">&lt;?php<br/> '.$kod.' <br/>?&gt;</div>';
  12.  
  13.  }
  14.  
  15. return ($code);  // I z tym i bez tego nie działa
  16.  
  17. }
  18.  
  19. function bbcode_php() {
  20.  
  21. $wzorzec = "#[ph p](.*?)[/ph p]#";
  22.  
  23. return preg_replace_callback($wzorzec, 'phphigh', $code);
  24.  
  25. }
  26.  
  27. $output = bbcode_php($code);
  28.  
  29. echo ($output);
  30.  
  31. ?>


jak zlikwiduję &lt i &gt i dam kod hello world pomiędzy <?php ?> to też białą strona...
bim2
A jak przekazujesz do funkcji bbcode_php() tekst który chcesz przeparsować? smile.gif Czegoś ci w niej brakuje ;]
Strarus
Już poprawiłem i teraz się wyświetla ale wyświetla się coś takiego:
test [ph p] echo 'hello world!'; [/ph p] test // [ph p] jest bez spacji

kod:
  1. <?php
  2.  
  3. $code = "test [ph p] echo 'hello world!'; [/ph p] test";
  4.  
  5. function phphigh($code) {
  6.  
  7.   if(is_array($code)) {
  8.    
  9.     $code = highlight_string($code[1]);
  10.  
  11. }
  12.  
  13. return ($code);
  14.  
  15. }
  16.  
  17. function bbcode_php($code) {
  18.  
  19. $wzorzec = "#/[ph p](.*?)/[/ph p]#";
  20.  
  21. return preg_replace_callback($wzorzec, 'phphigh', $code);
  22.  
  23. }
  24.  
  25. $output = bbcode_php($code);
  26.  
  27. echo ($output);
  28.  
  29. ?>
bim2
Dodaj może do wyrażenia regularnego modyfikator i oraz s smile.gif
Strarus
  1. <?php
  2. $wzorzec = "#[ph p](.*?)/[/ph p]#s";
  3. ?>

reszta jak wcześniej i nadal nie ma poprawy, znaczy pokazuje się kod php i dalsza część tekstu, kod jest nie pokolorowany i poprzedza wszystko...
bim2
znajdź błąd w tym "*?)/[/php" smile.gif
Pamiętaj że "[" to specjalne znaczniki winksmiley.jpg No i / nic nie robi :]
Strarus
przy takim kodzie:
  1. <?php
  2.  
  3. $code = "test [ph p]<?php echo 'hello world!'; ?>[/ph p] test";
  4.  
  5. function phphigh($code) {
  6.  
  7.  if(is_array($code)) {
  8.  
  9.    $code = highlight_string($code[1]);
  10.  
  11. }
  12.  
  13. return ($code);
  14.  
  15. }
  16.  
  17. function bbcode_php($code) {
  18.  
  19. $wzorzec = "#[ph p](.*?)[/ph p]#s";
  20.  
  21. return preg_replace_callback($wzorzec, 'phphigh', $code);
  22.  
  23. }
  24.  
  25. $output = bbcode_php($code);
  26.  
  27. echo ($output);
  28.  
  29. ?>


Składnia się koloruje ale jest w takiej postaci:
<?php echo 'hello world!'; ?> test 1 test

już nie mam pomysłów...
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.