Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][Regex]
maviozo
post
Post #1





Grupa: Zarejestrowani
Postów: 197
Pomógł: 24
Dołączył: 22.11.2010

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


Wyrażenia regularne niestety chyba nigdy nie będą moją specjalnością i wykładam sie przy prostych czynnościach. niby to rozumiem, ale nie wychodzi i już. Jest proste wyrażenie:
  1. `((?:https?|ftp)://\S+[[:alnum:]]/?)`si

wykorzystane w preg_replace. Chcę dodać warunek, że jeżeli PRZED dopasowywanym wyrażeniem jest cudzysłów, to dopasowanie ma być wykluczone. Znaczek wykluczenia to ^, ale nijak nie wiem, jak go tu zastosować. Proszę też o ewentualne słówko na temat ((?: a dokładnie znaku zapytania i dwukropka - co w tym momencie dają?

Ten post edytował maviozo 6.11.2011, 23:17:51
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
croc
post
Post #2





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


Najlepiej używać wzorców do URL wziętych z internetu. Ten jest całkiem niezły (nie przeraź się):

Kod
^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$


Czyli dla Twojego przypadku wyglądałoby to tak:

Kod
(?:^|[^"])(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?

Powinien działać idealnie. Na początek wzorca dałem fragment, który przepuści takie linki, które są na samym początku łańcucha znaków lub mają przed sobą dowolny znak inny niż cudzysłów.


A co do (?: ... ) - wszystkie funkcje preg_XXX traktują w specjalny sposób fragmenty wzorców zapisane w nawiasie. preg_match do wyników swojego działania (zmiennej podanej jako 3-ci parametr) dodaje wszystko co znajdzie, a oprócz tego wszystkie fragmenty w nawiasach. Jak dasz (?: ... ) zamiast normalnego nawiasu, to zawartość tego nawiasu nie jest przechwytywana. Pobaw się i porównaj wyniki tych instrukcji:
  1. preg_match('#Ala ma ([a-z]+)\.#', 'Ala ma kota.', $matches);
  2. print_r($matches);

oraz:
  1. preg_match('#Ala ma (?:[a-z]+)\.#', 'Ala ma kota.', $matches);
  2. print_r($matches);
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 19:22