Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] regexp - zamiana adresu URL na link
wiewiorek
post 7.11.2011, 19:50:36
Post #1





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


Jeśli w tekście są adresy URL, np. http://onet.pl to chciałbym żeby były zamieniane na linki: <a href="http://onet.pl>onet.pl</a> i odpowiednie wyrażenie regularne mam:
  1. "https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?"


No, ale to wyrażenie regularne zamienia mi na linki też adresy url wewnątrz, np. <img src="..." />, <a href="....">...</a>, <iframe src="..."></iframe> itp. - jak temu przeciwdziałać?
Go to the top of the page
+Quote Post
3 Stron V   1 2 3 >  
Start new topic
Odpowiedzi (1 - 19)
Sephirus
post 7.11.2011, 21:59:26
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Kod
"[^\"]{1}https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?[^\"]{1}"


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
wNogachSpisz
post 7.11.2011, 22:06:18
Post #3





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Do parsowania adresów URL służy funkcja parse_url()

Nie wywarzaj otwartych drzwi.
Nie wynajduj koła na nowo.
Nie używaj wyrażeń regularnych do standardowych zadań.

Ten post edytował wNogachSpisz 7.11.2011, 22:18:42
Go to the top of the page
+Quote Post
wiewiorek
post 8.11.2011, 07:21:56
Post #4





Grupa: Zarejestrowani
Postów: 247
Pomógł: 11
Dołączył: 5.09.2009

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


hm..... sprawdziłem wyrażenie
  1. [^\"]{1}https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?[^\"]{1}

dla tekstu:
http://gazeta.pl aaaaaa http://onet.pl dd <a href="http://onet.pl">onet.pl</a> ddd http://wp.pl

Na stronie testera wyrażeń regularnych: http://regexpal.com/ i odnajduje linki prawidłowo poza sytuacją gdy link jest na samym początku tekstu?

Ten post edytował wiewiorek 8.11.2011, 07:23:08
Go to the top of the page
+Quote Post
Sephirus
post 8.11.2011, 08:51:08
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ok masz poprawke
  1. "[^\"]*https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?[^\"]*"


@wNogachSpisz to może pokaż koledze jak rozwiązać jego problem przy użyciu wspomnianej przez Ciebie funkcji wink.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
croc
post 8.11.2011, 09:17:03
Post #6





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

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


Cytat(wNogachSpisz @ 7.11.2011, 22:06:18 ) *
Do parsowania adresów URL służy funkcja parse_url()

Do parsowania tak. Do sprawdzania poprawności nie. parse_url używa się dla linków, które już są sprawdzone, bo ta funkcja jest zbyt tolerancyjna.
Go to the top of the page
+Quote Post
wNogachSpisz
post 8.11.2011, 11:25:12
Post #7





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(croc @ 8.11.2011, 09:17:03 ) *
Do parsowania tak. Do sprawdzania poprawności nie. parse_url używa się dla linków, które już są sprawdzone, bo ta funkcja jest zbyt tolerancyjna.

Wierutna bazdura, funkcja parse_url() może z powodzeniem służyć do walidacji adrsu URL.

Croc, widać że nie masz bladego pojęcia o niczym.
Proszę Cię, dla dobra innych formuwiczów, nie wypowiadaj się,
jeśli już musisz, to do swoich wypowiedzi załączaj klauzule: "mogę się mylić" lub "nie znam się ale wydaje mi się".
Bez tego wprowadzasz zgubną dezinformację.

  1. <?php
  2.  
  3. foreach ( $link_list as $link ) {
  4.  
  5. $plink = parse_url($link);
  6.  
  7. if ( ! isset($plink['scheme']) OR ! in_array($plink['scheme'], array('http', 'https'))) {
  8. continue;
  9. }
  10. if ( ! isset($plink['host'])) {
  11. continue;
  12. }
  13.  
  14. $href = "$plink['scheme']://{$plink['host']}";
  15. $link = $plink['host'];
  16. }
  17.  
  18. ?>


Ten post edytował wNogachSpisz 8.11.2011, 11:33:20
Go to the top of the page
+Quote Post
wookieb
post 8.11.2011, 11:46:50
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




@wNogachSpisz uspokój się z zarzutami i spójrz
  1. print_r(parse_url('czy to jest url')); // [path] => czy to jest url

I co? Teraz ja powinienem na Ciebie wbijać?


--------------------
Go to the top of the page
+Quote Post
wNogachSpisz
post 8.11.2011, 11:51:02
Post #9





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(wookieb @ 8.11.2011, 11:46:50 ) *
  1. print_r(parse_url('czy to jest url')); // [path] => czy to jest url

Przeczytaj dokładnie mój code snip,
żeby walidować musisz dodpisać:
  1. isset($parsed_url['scheme']);

Następnym razem przeczytaj kilka razy to co napisałem.

Ten post edytował wNogachSpisz 8.11.2011, 11:55:34
Go to the top of the page
+Quote Post
wookieb
post 8.11.2011, 11:52:47
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Po co? Skoro jest filter_var?


--------------------
Go to the top of the page
+Quote Post
wNogachSpisz
post 8.11.2011, 11:54:49
Post #11





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Cytat(wookieb @ 8.11.2011, 11:52:47 ) *
Po co? Skoro jest filter_var?

Jasne, jeśli chcesz tylko walidować URL, filter_var() jest dokładnie tym co potrzebujesz...

Natomiastu tutaj trzeba sparsować URL, do czego służy parse_url(), po drodze można bez konieczności używania innych funkcji sprawdzić czy URL jest poprawny..

Wywołanie jednej funkcji jest tańsze niż wywołanie dwóch.

Jedyny problem z filter_var(), to fakt że wprowadzono je późno, dopiero w wersji 5.2.0

Ten post edytował wNogachSpisz 8.11.2011, 11:57:49
Go to the top of the page
+Quote Post
Sephirus
post 8.11.2011, 12:00:10
Post #12





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Ok bo ja się pogubiłem - ludzie przecież cała ta dyskusja jest bez sensu... Autor chciał rozwiązania pozwalającego zamienić ciąg:

Kod
jakiś tekst jakiś tekst
jakiś tekst jakiś tekst
ttp://www.strona.pl
jakiś tekst jakiś tekst
jakiś tekst jakiś tekst
ttp://www.inna-strona.com
jakiś tekst jakiś tekst
jakiś tekst jakiś tekst

(sprzed adresów skasowałem H bo mi na linki zamieniało)

na

  1. jakiś tekst jakiś tekst
  2. jakiś tekst jakiś tekst
  3. <a href="http://www.strona.pl">http://www.strona.pl</a>
  4. jakiś tekst jakiś tekst
  5. jakiś tekst jakiś tekst
  6. <a href="http://www.inna-strona.com">http://www.inna-strona.com</a>
  7. jakiś tekst jakiś tekst
  8. jakiś tekst jakiś tekst


Nic nie było o żadnej validacji linków, itd... smile.gif

Ten post edytował Sephirus 8.11.2011, 12:01:28


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
by_ikar
post 8.11.2011, 12:01:40
Post #13





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


@wNogahSpisz nie chcę się spierać, ale parse_url parsuje linki, a te link trzeba mieć. Autorowi tematu chodzi o ciąg który może zawierać linki, wówczas parse_url IMO nie ma za bardzo do tego jest potrzebne. Jeden preg_match i odpowiednie wyrażenie.

@up ubiegłeś mnie wink.gif

Ten post edytował by_ikar 8.11.2011, 12:02:38
Go to the top of the page
+Quote Post
croc
post 8.11.2011, 12:04:19
Post #14





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

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


Cytat(Sephirus @ 8.11.2011, 12:00:10 ) *
Nic nie było o żadnej validacji linków, itd... smile.gif

No tak, ale żeby zamienić, trzeba najpierw znaleźć smile.gif Można byle jak, np. przez wspomnianą funkcję parse_url, która przepuści większość nieprawidłowych linków, a można (większym kosztem) dobrym wyrażeniem regularnym.
Go to the top of the page
+Quote Post
nospor
post 8.11.2011, 12:07:07
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
No tak, ale żeby zamienić, trzeba najpierw znaleźć Można byle jak, np. przez wspomnianą funkcję parse_url,
Czyli że co? dla parse_url zapodasz cały tekst a on z niego wyłapie url? No raczej nie, do parse_url musisz przekazać już wybrane przez Ciebie url z tekstu a żeby to zrobić musisz tak czy siak użyć wyrażeń regularnych.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
wNogachSpisz
post 8.11.2011, 12:08:16
Post #16





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


W takim razie trzeba wcześniej załadować HTML do Dom:Document, co utworzy obiekt DOM,
następnie przeszukać bloki tekstowe w poszukiwaniu wyrazów rozpoczynających się na to "https?://".

Pozostaje problem zamiany konkretnego adresu url na element anachor to można w sensowny sposób osiągnąć tylko przy pomocy z preg_replace ;p
Lub jakiś inny sposób podziału na wyrazy..

Ten post edytował wNogachSpisz 8.11.2011, 12:14:40
Go to the top of the page
+Quote Post
croc
post 8.11.2011, 12:09:01
Post #17





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

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


@nospor Masz rację - źle się wyraziłem.

@wnogachspisz - wiesz, że istnieją jeszcze inne protokoły?

Ten post edytował croc 8.11.2011, 12:10:17
Go to the top of the page
+Quote Post
wNogachSpisz
post 8.11.2011, 12:11:54
Post #18





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Dobrze gdyby autor wrzcił przykładowe dane do przeszukania..

Cytat(croc @ 8.11.2011, 12:09:01 ) *
@wnogachspisz - wiesz, że istnieją jeszcze inne protokoły?

Wiesz.
Jaki z tego morał?

Ten post edytował wNogachSpisz 8.11.2011, 12:12:43
Go to the top of the page
+Quote Post
croc
post 8.11.2011, 12:13:17
Post #19





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

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


A po co Ci przykładowe dane? o0 Uzależniasz algorytm zamiany URL na linki od tego, jaką ma zawartość? Tzn. jakby miał inną, to byś dał inny algorytm?
Go to the top of the page
+Quote Post
wNogachSpisz
post 8.11.2011, 12:15:22
Post #20





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


croc nie troluj, zaklinam cie.
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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: 18.07.2025 - 01:41