Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [RegExp] Negacja słów
Forum PHP.pl > Forum > PHP
wookieb
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...

blooregard
  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.
wookieb
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
Zyx
  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.
wookieb
Czyli tak jak myślałem - nie da się. Bez flagi się nie obejdzie, ale dzięki za pomoc smile.gif
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.