Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> RegExp i negacja ciągu znaków
cycofiasz
post 25.01.2010, 20:04:08
Post #1





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


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.
Go to the top of the page
+Quote Post
seth-kk
post 26.01.2010, 00:21:46
Post #2





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

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


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


--------------------
Go to the top of the page
+Quote Post
krowal
post 26.01.2010, 10:27:38
Post #3





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

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


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. ?>


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
cycofiasz
post 26.01.2010, 18:12:03
Post #4





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


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]...
Go to the top of the page
+Quote Post
krowal
post 26.01.2010, 22:17:09
Post #5





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

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


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. ?>


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
cycofiasz
post 27.01.2010, 14:26:21
Post #6





Grupa: Zarejestrowani
Postów: 711
Pomógł: 127
Dołączył: 5.07.2008
Skąd: Łódź

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


O to mi właśnie chodziło smile.gif 10/10 . Dankeszyn smile.gif
Go to the top of the page
+Quote Post
Mikz
post 2.07.2010, 22:01:43
Post #7





Grupa: Zarejestrowani
Postów: 48
Pomógł: 3
Dołączył: 7.12.2007

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


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")

Ten post edytował Mikz 2.07.2010, 22:06:36
Go to the top of the page
+Quote Post
Neo
post 2.07.2010, 22:06:58
Post #8





Grupa: Zarejestrowani
Postów: 43
Pomógł: 9
Dołączył: 8.08.2009
Skąd: Olsztyn

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


http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/

"Grupowanie wzorów", "Lookahead" ...
Go to the top of the page
+Quote Post
Mikz
post 2.07.2010, 22:15:43
Post #9





Grupa: Zarejestrowani
Postów: 48
Pomógł: 3
Dołączył: 7.12.2007

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


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)

Ten post edytował Mikz 2.07.2010, 22:29:36
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 - 11:28