Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: RegExp i negacja ciągu znaków
Forum PHP.pl > Forum > PHP
cycofiasz
Witam, chciałbym stworzyć regułkę która ma za zadanie "akceptować" wszystkie linki http/ftp oprócz http://strona i ftp://strona

Obecnie mam kod:
  1. <?php
  2.  
  3. $link = 'http://strona.pl/asdsd/plik.htm';
  4.  
  5. if( preg_match('/^(htt|ft)p:\/\/(?)/',$link) ) echo 'OK';
  6. else echo 'NIE';
  7.  
  8. ?>


(?) - co wstawić zamiast tego? Jak zanegować cały ciąg znaków a nie zakres? Wiem że mógłbym to rozdzielić na 2 preg_match ale musi być jakieś rozwiązanie w regexp smile.gif Liczę na waszą pomoc.
seth-kk
nie spotkalem sie z rozwiazaniem w czystym RegExp ale mozesz podac 3ci parametr w ktorym dostaniesz znalezione wartosci z nawiasow i je porownac str_cmp() lub czyms podobnym
krowal
A nie prościej byłoby po prostu sprawdzać czy url zawiera ciąg 'http://strona' i jeśli tak to go odrzucać ?

  1. <?php
  2. $link = 'http://strona.pl/asdsd/plik.htm';
  3. if(preg_match('/(htt|ft)p:\/\/strona.*?/',$link) )
  4. echo 'ZLE';
  5. else
  6. echo 'DOBRZE';
  7. ?>
cycofiasz
krowal, skrypt musi też sprawdzać poprawność linku

zrobiłem inaczej niż chciałem ale w sumie też takie rozwiązanie mnie zadowala:
  1. $link = 'http://strona.pl/asdsd/plik.htm';
  2.  
  3. preg_match('/^(htt|ft)p:\/\/(strona)?/',$link,$matches);
  4.  
  5. if($matches[1] && !$matches[2]) echo 'OK';
  6. else echo 'ERROR';


Fajnie by było jednak gdyby można było negować ciąg znaków a nie zakres [^ciąg znaków]...
krowal
A to sorry, nie zrozumieliśmy się, owszem jest coś takiego co neguje ciąg a nie zakres smile.gif
  1. <?php
  2. $link = 'http://strona.pl/asdsd/plik.htm';
  3. if(preg_match('/^http:\/\/(?!strona).*/',$link) )
  4. echo 'Dobrze';
  5. else
  6. echo 'Zle';
  7. ?>
cycofiasz
O to mi właśnie chodziło smile.gif 10/10 . Dankeszyn smile.gif
Mikz
Przepraszam że odkopuję temat, ale jestem tym strasznie zainteresowany. Miałem kiedyś problem z negacją ciągu za pomocą wyrażeń regularnych i nie został on przeze mnie rozwiązany (zastosowałem wtedy jakąś durną drogę "naokoło"). Próbowałem znaleźć jakiekolwiek źródła dotyczące składni podanej przez krowala, ale nigdzie nie ma absolutnie nic na ten temat. Czy ktoś zna jakieś źródło w internecie które traktuje o takiej konstrukcji wyrażenia trochę szerzej?
Chodzi mi oczywiście o (?!ciąg).

Tutaj jest przykład w jaki sposób ludzie próbują dokonać tego cuda za pomocą wyrażeń, a mi do dzisiaj nie chce się wierzyć że nie ma lepszej metody:
http://wiki.tcl.tk/989 (sekcja "Negated string")
Neo
http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/

"Grupowanie wzorów", "Lookahead" ...
Mikz
Cytat(Neo @ 2.07.2010, 23:06:58 ) *
http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/

"Grupowanie wzorów", "Lookahead" ...

Bardzo dziękuję, niestety nie jestem w stanie kliknąć "Pomógł" bo to nie mój topic.
Jednak wciąż:
  1. preg_match('/^.*(?!ciag)$/', 'to jest jakis ciag');

nie zadziała zgodnie z oczekiwaniem.

Zapytam inaczej:
Czy istnieje jakieś wyrażenie (poza oczywiście tą wymienioną przeze mnie w poprzednim poście), dzięki któremu preg_match() zwróci mi true dla KAŻDEGO ciągu który NIE ZAWIERA ciągu podanego przeze mnie? Jeśli tak, to czy look-ahead jest tutaj dobrym tropem?

Ok, sam sobie odpowiedziałem, na podstawie artykułu podanego przeze mnie wcześniej. Mój błąd że przeczytałem go zbyt mało dokładnie. Dla potomności:

{^(?!(.*ciag.*))}


(ten wątek jest jednym z niewielu wyników w googlu dla "negacja ciągu" więc przyda się tutaj taka informacja)
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.