Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Wyrażenia regularne, negacja alternatywy
Capellini
post 8.03.2009, 10:12:15
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

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


Chciałbym żeby jakiś tekst spełniał moje wyrażenie regularne wtedy kiedy zaczyna się od '<' potem następuje coś innego niż 'b', 'i', 'u', 'strong', 'a', a później jest '>'. Przykłady:

Dla: '<div>' zwraca true

Dla: '<b>' zwraca false

Dla: '<body>' zwraca true

Dla: '<strong>' zwraca false

Próbowałem w ten sposób:

<(^(b|a|u|s|i|strong))>

czyli najpierw '<' potem jakiś tekst inny niż 'b', 'i', 'u', 'strong', 'a', a na końcu '>'


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
wookieb
post 8.03.2009, 11:03:04
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Kod
<[^u|i|strong|b|a]>


Ten post edytował wookieb 8.03.2009, 11:31:08


--------------------
Go to the top of the page
+Quote Post
Capellini
post 8.03.2009, 12:05:51
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

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


Teraz za każdym razem zwraca false

Czy nawiasy kwadratowe przypadkiem nie oznaczają tylko jednego znaku?


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
wookieb
post 8.03.2009, 12:48:08
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Pokaż kod i tekst jaki sprawdzasz.


--------------------
Go to the top of the page
+Quote Post
Capellini
post 8.03.2009, 14:32:56
Post #5





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

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


Sprawdzam tutaj: http://maciek.lasyk.info/regexp_checker.html

Działa tylko jeżeli pomiędzy nawiasami trójkątnymi jest jeden znak i inny niż 'b', 'a', 'u' itd., np. działa dla '<m>'

Ten post edytował Capellini 8.03.2009, 14:35:20


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
zegarek84
post 8.03.2009, 18:07:52
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(Capellini @ 8.03.2009, 10:12:15 ) *
czyli najpierw '<' potem jakiś tekst inny niż 'b', 'i', 'u', 'strong', 'a', a na końcu '>'

nie wiem do czego Ci to potrzebne więc wyszukałem tylko te znaczniki które ma znajdować wyrażenie regularne, jeśli jakieś znaczniki co mają być zaczynają się tak samo jak znaczniki co ich ma nie być to w nawiasie (?=body) poprzez wstawienie znaku | i "słowa" dodajesz kolejne wyjątki które mają należeć do wyrażenia.... - dało sie prościej gdyby działały symbole łączone w wyrażeniach - tzn teoretycznie są ale coś u mnie wywala błąd - widać nie obsługuje (więc trochu okrężna drogą ale też działa winksmiley.jpg...

ps. w nawiasie (?!b|a|u|strong|i|s) dodajesz te znaki których ma nie być - przy czym skoro strong nie jest na liście wyjątków to tam bez potrzeby został umieszczony ^^ - zawsze przy lub dopasowuje z lewej strony dlatego w pierwszej kolejnosci sprawdza czy jest wyjątek a potem czy nie ma wyjątków....


  1. <?php
  2. $text='Dla: "<div>" zwraca true
  3. Dla: "<b>" zwraca false
  4. Dla: "<body>" zwraca true
  5. Dla: "<strong>" zwraca false';
  6.  
  7. preg_match_all('/<(?:(?=body)|(?!b|a|u|strong|i|s))([^>]+?)>/is', $text, $matches);
  8. echo '<pre>';
  9. print_r($matches);
  10. echo '</pre>';
  11. ?>


Ten post edytował zegarek84 8.03.2009, 18:22:38


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Capellini
post 12.03.2009, 17:46:57
Post #7





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

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


zegarek, czy mógłbyś mi jeszcze wytłumaczyć jak to działa? Co oznacza '?=' i '?!'?


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
Hazel
post 12.03.2009, 18:32:38
Post #8





Grupa: Zarejestrowani
Postów: 492
Pomógł: 33
Dołączył: 16.08.2007
Skąd: Wrocław

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


Pewnie by mógł, ale po co ma tłumaczyć, skoro sam możesz o tym poczytać smile.gif

http://en.wikipedia.org/wiki/Regular_expression


--------------------
Go to the top of the page
+Quote Post
Capellini
post 12.03.2009, 19:18:13
Post #9





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

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


W tekście, do którego dałeś linka nie znalazłem nic na temat wykrzyknika. Nadal nie wiem co oznacza '?=' i "?!"


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
zegarek84
post 12.03.2009, 21:10:57
Post #10





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


http://codebase.pl/php/15 - ten kurs jest słaby jeśli chodzi o wyrażenia regularne ale jest wspomniane tam o grupowaniu tych wyrażeń w nawiasach - czyli bedziesz wiedział co który nawias znaczy... nie widzę tam jeszcze tego:
(?<nazwa>) - grupa nazwana. Umożliwia dostęp do grupy bez podawania jej numeru (nazwana zmienna - ale tworzy też odwołanie numeryczne)

są jeszcze "symbole łączone" ale coś nie obsługuje ich mój serwerek lub to tylko teorja ;p (dużo by ułatwiły)


--------------------
Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.

Go to the top of the page
+Quote Post
Capellini
post 14.03.2009, 14:15:31
Post #11





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

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


Kod
<(?!b|a|u|strong|i|s)>


No dobra, a dlaczego nie działa po prostu takie coś jak powyżej?


--------------------
WIELKIE DZIĘKI ZA POMOC!
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: 14.08.2025 - 06:12