Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [RegExp] Negacja słów
wookieb
post 19.04.2010, 19:28:25
Post #1





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




Czy jest możliwe zanegowanie całych słów w wyrażeniu regularnym?
Chcę napisać wyrażenie regularne, które zaakceptuje wszystkie inne słowa poza np. foo, bar

Przykładowe wyniki "testu" wyrażenia

widok - ok
foo - nie ok
bar - nie ok
foobar - ok
mieso - ok
itd...



--------------------
Go to the top of the page
+Quote Post
blooregard
post 19.04.2010, 20:23:14
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




  1. if (preg_match('/(^zaprojektowany|zmiennej|przez)/' , $text))
  2. echo 'błąd';
  3. else
  4. echo 'ok';


Wynik dla: 'Grumman F-14 Tomcat (ang. Kocur) ? amerykański naddźwiękowy, myśliwiec pokładowy Marynarki Wojennej Stanów Zjednoczonych o zmiennej geometrii skrzydeł zaprojektowany przez wytwórnię Grumman.' : błąd

Wynik dla: 'Grumman F-14 Tomcat (ang. Kocur) ? amerykański naddźwiękowy, myśliwiec pokładowy Marynarki Wojennej Stanów Zjednoczonych' : ok

Wynik dla: 'Grumman F-14 Tomcat (ang. Kocur) ? amerykański naddźwiękowy': ok

Wynik dla: 'myśliwiec pokładowy Marynarki Wojennej Stanów Zjednoczonych o zmiennej geometrii ' : błąd.
Powód edycji: [blooregard]:


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
wookieb
post 22.04.2010, 18:54:01
Post #3





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




No i właśnie o to mi chodzi, że negacja powinno negować wyrażenie w poniżej opisany sposób.
Przykładowo wyrażenie
  1. preg_match('/(^test|hehe)/', 'foo');

Powinno zwrócic prawdę. Dlaczego?
"Szukaj ciągu NIE test lub NIE hehe" a lol takimi słowami nie jest.
Może źle rozumiem negację ale wyjaśnię po co mi coś takiego.

Tworzę na swojego potrzeby klasę do menu gdzie dla każdego elementu wstawić ustawienie kiedy element jest aktywny (jaki moduł, kontroler, akcja) i zrealizowałem to w ten sposób że dane ustawienie jest częścią wyrażenia regularnego. Np
Kod
kontroler = user|photos

Dopasuje kontroler user i photos.
Natomiast teraz chciałbym dodać warunek, że element ma być aktywny dla wszystkich akcji POZA tymi, które ustalę np list|edit, dlatego zastanawiam się jak to zapisać w wyrażeniu regularnym.
Oczywiście ostatecznością w tym przypadku byłoby skorzystania z takiego wyrażenia "list|edit" i dodatkowo dodanie oddzielnej flagi zanegowania.
Wyglądałoby to tak
Kod
action=list|edit
action_negate=true


Ten post edytował wookieb 22.04.2010, 19:14:55


--------------------
Go to the top of the page
+Quote Post
Zyx
post 22.04.2010, 21:27:30
Post #4





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


  1. !preg_match('/(zmiennej|geometrii)/', $text)


Z teorii automatów: jeśli automat skończony (tj. wyrażenie regularne) akceptuje język X, to aby akceptować dopełnienie języka X, wystarczy zamienić miejscami stany akceptujące i odrzucające (czyli krótko mówiąc: zanegować).

Ponadto poczytaj sobie o znaczeniu symbolu ^ w wyrażeniach regularnych Perla, gdyż nie działa on tak, jak myślisz. Jako negacja funkcjonuje wyłącznie w klasie znaków, tj. w nawiasach kwadratowych, a wszędzie indziej reprezentuje początek badanego słowa.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
wookieb
post 22.04.2010, 22:08:29
Post #5





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




Czyli tak jak myślałem - nie da się. Bez flagi się nie obejdzie, ale dzięki za pomoc smile.gif


--------------------
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: 30.04.2025 - 04:38