![]() |
![]() ![]() |
![]() |
![]()
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:
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 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 706 Pomógł: 108 Dołączył: 12.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
(?: ... ) daje to, że obejmuje grupuje wyrażenie podobnie jak sam nawias, ale nie zapisuje go do wyniku. Bardzo przydatne.
Co do Twojego wyrażenia, to czy ma to być po prostu każdy URL bez cudzysłowu na początku? Bo Twoje wyrażenie nie jest najlepsze do szukania URL. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 24 Dołączył: 22.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Widocznie na zrozumienie tego co napisałeś, jestem za tępy, ale wyjaśnienie nic mi nie dało. Do jakiego wyniku nie zapisuje? Wstyd, ale jest to naprawdę jedna z niewielu rzeczy, których nie mogę pojąć. Irytuje mnie to, bo wielokrotnie potrzebuję tych nieszczęsnych wyrażeń i zawsze ciężko z tym walczę.
Tak, chodzi o pomijanie linków, jeżeli przed nimi jest cudzysłów. |
|
|
![]()
Post
#4
|
|
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: oraz: |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 24 Dołączył: 22.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Pokaźny post. Na pewno się z nim zaznajomię. Wytłumacz mi tylko w takim razie, czy dobrze rozumuję. Kod, który zresztą też uraczyłem się z googla, ma postać:
Z tego co rozumiem, to w powyższym, http nie powinno być dopasowane i podstawiana pod $1 wartość powinna być bez http lub https lub ftp. Dlaczego jednak, po przepuszczeniu linka http://test.pl/test dostaję: ? Cytat 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. Faktycznie tak to działa, ale co z linkami, które nie są na początku łańcucha?... Ten post edytował maviozo 7.11.2011, 00:21:37 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 02:17 |