Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Własna funkcja kolorująca składnię - mały problem...
ladovnik
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


Witam. Zrobiłem sobie funkcję, która koloruje składnię. Wszystko w sumie ładnie chodzi, ale bez problemów obyć się nie mogło... Funkcja zmienia znaki * , . () na fioletowe a kody znajdujące się pomiędzy ' a ' na zielone. Problem polega na tym, że jeżeli między ' a ' znajdzie się znak * , . () to jest on oczywiście zamieniony na fioletowy... Czy wiecie jak takiej sytuacji zaradzić? Aby funkcja zamieniając znaki * , . () omijała fragmenty tekstu zawarte miedzy ' a '?

Oto moja funkcja:
  1. <?php
  2. function syntax($string)
  3. {
  4.    $after=Array(
  5.    0=>"/=/",
  6.    1=>"/*/",
  7.    2=>"/(/",
  8.    3=>"/)/",
  9.    4=>"/./",
  10.    5=>"/,/"
  11.    );
  12.    $before=Array(
  13.    0=>"<span style=\"color:#FF00FF;\">=</span>",
  14.    1=>"<span style=\"color:#FF00FF;\">*</span>",
  15.    2=>"<span style=\"color:#FF00FF;\">(</span>",
  16.    3=>"<span style=\"color:#FF00FF;\">)</span>",
  17.    4=>"<span style=\"color:#FF00FF;\">.</span>",
  18.    5=>"<span style=\"color:#FF00FF;font-weight:bold;\">,</span>"
  19.    );
  20.    $string=preg_replace($after, $before, $string);
  21.    $string=preg_replace("#'(.*?)'#si", "<span style=\"color:green;\">'1'</span>", $string);
  22.    return $string;
  23. }
  24. ?>


Proszę o pomoc i pozdrawiam,
ladovnik

Ten post edytował ladovnik 25.11.2008, 18:22:21
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
skim
post
Post #2





Grupa: Zarejestrowani
Postów: 19
Pomógł: 3
Dołączył: 9.05.2007
Skąd: Krzyż Wielkopolski

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


można by było się pobawić wyrażeniami regularnymi... np.:
- gdy między dwoma apostrofami znajdzie się obojętnie jaki znak - koloruj wszystko na zielono
- gdy w kodzie znajdzie się sama gwiazdka (*) pokoloruj ją na fioletowo lecz nie koloruj tych gwiazdek które mają obok siebie jakiekolwiek znaki alfanumeryczne...

wyrażenia są tym czym szukasz... definiowanie tylko co gdzie i jak będzie chyba trochę kosztowało sporo czasu... poczytaj gdzieś bo wyrażenia regularne to obszerny temat jak na odpowiedź na forum a ja chciałem Cię tylko naprowadzić

pozdr
Go to the top of the page
+Quote Post
ladovnik
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


Wielkie dzięki! Poczytałem sobie o wyrażeniach regularnych i udało mi się rozwiązać problem winksmiley.jpg

Mam tylko jeszcze pytanie... w wyrażeniach regularnych, jeśli chce użyć [^] czyli negacji, to jak zrobić aby dać do negacji cały jeden ciąg znaków? Tzn. chodzi mi o to, że np.
[^<span style=\"color:green\">"]\W

potraktuje z osobna każdy znak, a mnie chodzi o to, aby do negacji trafiło to jako cały jeden ciąg znaków. Ktoś wie jak to zrobić?

Jeśli ktoś nie rozumie, o co mi chodzi, proszę napisać a postaram się to wytłumaczyć w inny sposób.

Pozdrawiam,
ladovnik

Ten post edytował ladovnik 28.11.2008, 18:03:12
Go to the top of the page
+Quote Post
skim
post
Post #4





Grupa: Zarejestrowani
Postów: 19
Pomógł: 3
Dołączył: 9.05.2007
Skąd: Krzyż Wielkopolski

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


jak zapewne czytałeś, jest takie coś w tych wyrażeniach jak kwadratowy nawias w którym może być ten ciąg znaków...

Ten post edytował skim 29.11.2008, 11:03:05
Go to the top of the page
+Quote Post
ladovnik
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 25.11.2008
Skąd: Polska

Ostrzeżenie: (10%)
X----


Tak, i użyłem tych nawiasów: [] lecz nie przyniosło to spodziewanego efektu. Wiem nawet dlaczego. Proszę zobaczyć:
  1. <?php
  2. function syntax($string)
  3. {
  4.    $string=preg_replace('#\"(.*?)"#si', '<span style="color:gray;">"1"</span>', $string);
  5.    $string=preg_replace("#'(.*?)'#si", "<span style=\"color:gray;\">'1'</span>", $string);
  6.    $after1=Array(
  7.    0=>"/[^[<][<span style=\"color:gray;\">\"][<span style=\"color:gray;\">']]W=W[^['<span>][\"<span>][>]]/",
  8.    );
  9.    $before2=Array(
  10.    0=>"<span style=\"color:#FF00FF;\">=</span>",
  11.    );
  12.    $string=preg_replace($after1, $before2, $string);
  13.    return $string;
  14. }
  15. $string = "asda=asdsd 'id=dse' \"sdfsdf=\" sdasd=asdad \"asdads=adasd\"";
  16. echo syntax($string);
  17. ?>


Znak = zostanie podmieniony na kolorowy tylko wtedy, jeśli nie zawiera po swojej lewej stronie ciągu znaków: <span style="color:gray;">" lub <span style="color:gray;">' lub < oraz gdy nie będzie zawierał po swojej prawej stronie ciągu znaków '</span> lub "</span> lub >.

I działa to dla znaków = umieszczonych miedzy " a " lub 'a', które zamienia na szare i nie koloruje w nich znaku "=". Jest jednak problem. Otóż, po przemianie mojej zmiennej $string wygląda ona tak:
  1. asda=asdsd <span style="color:gray;">'id=dse'</span> <span style="color:gray;">"sdfsdf="</span> sdasd=asdad <span style="color:gray;">"asdads=adasd"</span>

Pierwszy znak = umieszczony bez " " lub ' ' też na dobrą sprawę ma po swojej prawej stronie ciąg znaków "<span> '</span> > i dlatego nie jest zamieniony na kolorowy. Podobna sytuacja ze znakiem = umieszczonym kawałek dalej, również nie pomiędzy "a" lub 'a'. Ma na dobrą stronę po prawej stronie ciągi znaków zabronione i po lewej też, dlatego nie jest zamieniany. Nie potrafię sobie z tym poradzić, czy ktoś ma jakiś pomysł?

Pozdrawiam,
ladovnik

Ten post edytował ladovnik 29.11.2008, 14:21:28
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 Aktualny czas: 21.08.2025 - 04:50