Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] regexp - zamiana adresu URL na link
wiewiorek
post
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 - 43)
Sephirus
post
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}"
Go to the top of the page
+Quote Post
wNogachSpisz
post
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
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
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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
croc
post
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
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
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
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
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
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
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... (IMG:style_emoticons/default/smile.gif)

Ten post edytował Sephirus 8.11.2011, 12:01:28
Go to the top of the page
+Quote Post
by_ikar
post
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 (IMG:style_emoticons/default/wink.gif)

Ten post edytował by_ikar 8.11.2011, 12:02:38
Go to the top of the page
+Quote Post
croc
post
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... (IMG:style_emoticons/default/smile.gif)

No tak, ale żeby zamienić, trzeba najpierw znaleźć (IMG:style_emoticons/default/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
Post #15





Grupa: Moderatorzy
Postów: 36 561
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.
Go to the top of the page
+Quote Post
wNogachSpisz
post
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
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
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
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
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
Sephirus
post
Post #21





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

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


Mam też parę innych propozycji zamiast wyrażeń regularnych:

1. Można użyć zcze strpos() - znaleźć wszystko co zaczyna się od "http://" i odpowiednio zamienić.
2. Można dać explode('http://',$ciag_znakow) - też da się wtedy to ładnie pozamieniać i użyć implode.

;P

Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #22





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

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


Cytat(Sephirus @ 8.11.2011, 12:26:08 ) *
Mam też parę innych propozycji zamiast wyrażeń regularnych:

1. Można użyć zcze strpos() - znaleźć wszystko co zaczyna się od "http://" i odpowiednio zamienić.
2. Można dać explode('http://',$ciag_znakow) - też da się wtedy to ładnie pozamieniać i użyć implode.

;P


No nie. Trzeba znaleść "wolnostojące" adresy, czyli takie które są otoczone albo przez białe znaki, albo przez początek/koniec bloku..
I to z włączniem contentu chociażby takich tagów jak anachor.
Go to the top of the page
+Quote Post
croc
post
Post #23





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

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


URL-e zawsze są otoczone znakami... niewchodzącymi do poprawnego URL-a. (IMG:style_emoticons/default/oneeyedsmiley02.png)
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #24





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

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


Cytat(croc @ 8.11.2011, 12:38:47 ) *
URL-e zawsze są otoczone znakami... niewchodzącymi do poprawnego URL-a. (IMG:style_emoticons/default/oneeyedsmiley02.png)

niech ktos z nim cos zrobi, błagam...
Go to the top of the page
+Quote Post
croc
post
Post #25





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

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


A może nie jest tak?

To jest Twoim zdaniem URL?
Kod
programowaniewymagamyśleniahttp://php.planietylkoklepaniajakmałpa
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #26





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

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


Tak, tak jest..
Tylko że nic z tego nie wynika.
Taka wiedza nie pozwala na bezbłędna zamianę linków na anchory w dowolnym dokumencie HTML

  1. <a href="#">this is some http://link.me link</a>

zostanie zamienione na :
  1. <a href="#">this is some <a href="#">http://link.me</a> link</a>

co jest oczywiście nieprawidłowe.

Ten post edytował wNogachSpisz 8.11.2011, 13:10:37
Go to the top of the page
+Quote Post
croc
post
Post #27





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

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


Nie nie pozwala, tylko Ty nie umiesz, a to różnica. Nie wymądrzaj się więcej, bo naprawdę mało wiesz.
Go to the top of the page
+Quote Post
wookieb
post
Post #28





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




Piaskownice zamknęli, deszcz nie napadał że musicie tutaj obrzucać się błotem? Spokojniej, bo zamknę temat.
Powód edycji: [wookieb]:
Go to the top of the page
+Quote Post
croc
post
Post #29





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

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


Cytat(wookieb @ 8.11.2011, 13:10:23 ) *
Piaskownice zamknęli, deszcz nie napadał że nie musicie tutaj obrzucać się błotem?

Aleś sypnął żarcicho (IMG:style_emoticons/default/yahoo.gif) Przepraszam, ale mam alergię na takich szczekaczy.

A wracając do tematu, to moim zdaniem jedyną odpowiedzią jest dobry wzorzec dla wyr. regularnego (wyszukany z internetu, bo są ludzie, którzy naprawdę dużo czasu temu poświęcili) i będzie hulać.
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #30





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

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


Cytat(croc @ 8.11.2011, 13:14:32 ) *
A wracając do tematu, to moim zdaniem jedyną odpowiedzią jest dobry wzorzec dla wyr. regularnego (wyszukany z internetu, bo są ludzie, którzy naprawdę dużo czasu temu poświęcili) i będzie hulać.


Sypiesz złotymi radami na lewo i prawo...
Nie ma takiej możliwości, jedno wyrażenie tego nie załatwi, chyba że takie na 3 strony.
Zamknąć oczy, napisać i już nigdy nie zrozumiec co robi i dlaczego nie działa (IMG:style_emoticons/default/happy.gif) .
Go to the top of the page
+Quote Post
croc
post
Post #31





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

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


Trochę dziwne, że nagle zmieniłeś podejście. Przed chwilą polecałeś parse_url, który nieprawidłowo odczyta mnóstwo URL-i, również takich "z życia wziętych". A dobre wyrażenie regularne nie musi wcale być na 3 strony. Co Ci się nie podoba np. w tym?
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})*)?$
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #32





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

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


Przepiękne wyrażenie, tyle że kompletnie nie nadające się do tego celu.
Piszesz nie na temat.

Pytam grzecznie, uprzejmie i konkretnie, co się stanie z takim przykładem:
  1. <a href="#">this is some http://link.me link</a>

Nie masz na to odpowiedzi, bo brakuje Ci wiedzy i doświadczenia (oraz innych cech, takich nienabywalnych).
Teraz rozmawiają dorośli.
Patrz i się ucz.
Nie troluj.

Ten post edytował wNogachSpisz 8.11.2011, 14:13:08
Go to the top of the page
+Quote Post
Sephirus
post
Post #33





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

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


Ok tu się z zgadzam z @wNogachSpisz w takim przypadku dobre rozwiązanie to zastosować twoją metodę z DOM. Swoją drogą to bardzo rzadki przypadek ale możliwy.
Go to the top of the page
+Quote Post
by_ikar
post
Post #34





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

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


A ja się nie zgodzę i nie muszę używać wcale DOM żeby sprawę załatwić. Można to załatwić jednym wyrażeniem, tyle że z użyciem preg_replace_callback i można załatwić całość w sumie prosto w kilku linijkach:

Kod
<?php

$str = '

<a href="http://example.com"> http://example.com </a> <br><br>

smoe text http://example.com smoe text <a href="http://example.com"> http://example.com </a> smoe text<br>
some text https://example.com some text <a href="https://example.com"> https://example.com </a> smoe text<br>
smoe text http://subdomian.example.com smoe text <a href="http://subdomian.example.com"> http://subdomian.example.com </a> smoe text<br>
some text https://subdomian.example.com some text <a href="https://subdomian.example.com"> https://subdomian.example.com </a> smoe text<br>
smoe text http://www.example.com smoe text <a href="http://www.example.com"> http://www.example.com </a> smoe text<br>
some text https://www.example.com some text <a href="https://www.example.com"> https://www.example.com </a> smoe text<br>
smoe text http://www.subdomian.example.com smoe text <a href="http://www.subdomian.example.com"> http://www.subdomian.example.com </a> smoe text<br>
some text https://www.subdomian.example.com some text <a href="https://www.subdomian.example.com"> https://www.subdomian.example.com </a> smoe text

';

$replace = preg_replace_callback('#(?:<a[^>]*>.*?</a>|((f|ht)tp(s)?://[^\s]+))#is', 'callbackFunction', $str);

function callbackFunction($matches)
{
    if(!empty($matches[1]))
    {
        return '<a href="'.$matches[1].'"> '.$matches[1].' </a>';
    } else
    {
        return $matches[0];
    }
}

echo $replace;


Można pewnie to napisać lepiej, to jest tylko taki przykład że da się jednym wyrażeniem i można pominąć to czego nie chcemy (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #35





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

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


BZDURA! Twój pattern błędnie zamienia:
  1. <img src="http://www.wp.pl"/>

Na:
  1. <img src="<a href="http://www.wp.pl"/>"> http://www.wp.pl"/> </a>

Kiła i mogiła.
Bez DOM tego nie zrobisz..

Ten post edytował wNogachSpisz 8.11.2011, 22:18:05
Go to the top of the page
+Quote Post
by_ikar
post
Post #36





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

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


Kolego, nie chce tutaj siać flejmu, bo gdybyś doczytał moją wiadomość do końca to byś zauważył jedną zasadniczą rzecz o której napisałem:

Cytat
Można pewnie to napisać lepiej, to jest tylko taki przykład że da się jednym wyrażeniem i można pominąć to czego nie chcemy


Podałem przykład z tylko jednym tagiem, to jest przykład, nie gotowiec.. :/ trochę na siłę próbujesz udowodnić swoją rację jakby była jedynym słusznym wyjściem..

Jeżeli działa w przypadku anchora co pokazałem w przykładzie, dlaczego nie miałoby działać w przypadku jakiegokolwiek innego tagu? Bo musi tutaj być DOM? Nie musi co udowodniłem swoim przykładem (IMG:style_emoticons/default/wink.gif) a nawet nie trzeba więcej niż 1 wyrażenia i wcale nie musi mieć nie wiadomo ile lini/znaków. (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #37





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

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


Nie rozumiem tej nowomowy.
Działa czy nie działa?
Nie działa.
Po co komu coś, co nie działa?
Zrób porządnie, napisz posta, do tego czasu zamilcz.

Ten post edytował wNogachSpisz 8.11.2011, 23:24:45
Go to the top of the page
+Quote Post
abort
post
Post #38





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


@croc:
regexp mocny, ale jednak mi sie nie podoba. A co mi się nie podoba? Wrzuć do przeglądarki kod:

  1. $urls=array (
  2. "http://forum.php.pl/index.php?showtopic=187323&st=20",
  3. "http://195.242.93.150/index.php?showtopic=187323&st=20",
  4. "http://127.0.0.1/",
  5. "http://host"
  6. );
  7.  
  8. foreach ($urls as $url) {
  9. echo "$url ";
  10. if (preg_match ('/^(?#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})*)?$/', $url))
  11. print "to poprawny URL<br>";
  12. else print "to nie jest poprawny URL<br>";
  13. }


A jak sam dobrze wiesz, wszystkie URLe w tablicy są prawidłowe (IMG:style_emoticons/default/smile.gif)
Generalnie, z tego co widzę, to regexp uwala wszystkie numeryczne adresy IP i wszystkie adresy IP bez POPRAWNEJ domeny (przy czym POPRAWNĄ domeną jest tylko jedna z TLD). Wszelkie domeny "wewnątrzfirmowe" (np. firma.lan) są według tego regexpa niepoprawne. Tak, wiem - regexp to nie resolver - i nie jest od rozwiązywania nazw, więc pomińmy nietypowe/niepubliczne domeny. Ale numeryczne adresy IP są jak najbardziej "valid", podobnie jak adresy z samą tylko nazwą hosta (ciągle aktualny RFC 1035, p. 2.3.1)
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #39





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

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


@abort
Zlituj się.
Walidacja URLi to nie problem.
Problemem jest wyciąnięcie ich z HTMLa.
Go to the top of the page
+Quote Post
abort
post
Post #40





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


wNogachSpisz: własnie - generalnie pytanie było odnośnie metody przetworzenia tekstu źródłowego jako inny, treściowo identyczny tekst, z udogodnieniem w postaci "jeśli jest URL, to dajmy go w wygodniejszy sposób - taki, by user mógł po prostu kliknąć, zamiast przerzucać do paska adresu przez schowek". Tak przynajmniej ja zrozumiałem pierwszy post w wątku.

I teraz ad meritum: jeśli mamy DOWOLNY ciąg znaków, to musimy sprawdzić, czy gdzieś tam nie zapodział się URL. To jest to co sam napisałeś: "Trzeba znaleźć "wolnostojące" adresy, czyli takie które są otoczone albo przez białe znaki, albo przez początek/koniec bloku". Zgodzisz się chyba z moim stwierdzeniem, że skoro "trzeba znaleźć adresy", to musimy mieć/znać metodę na określenie początku i końca dowolnego poprawnego adresu, prawda?

Idąc dalej: mając wyszukany dowolny adres URL możemy otoczyć go w tagi html i zaprezentować w "klikalnej" formie.
Dodatkowe założenie: istniejące już w tekście odnośniki html (np. do obrazków) zostawiamy bez obróbki.

I to w zasadzie koniec tematu - metodologię mamy określoną. Pozostaje wybór narzędzia. W związku z tym nasuwa się pytanie: czy można określić, czy dany ciąg znaków otoczony konkretnymi znakami (białymi znakami) jest adresem URL - i czy da się to zrobić za pomocą regexpa?

Odpowiedź jest jedna: MOŻNA. Można to zrobić za pomocą wyrażenia regularnego (tak jak pisał croc) - zacytowany przez niego regexp daje sobie radę ze znakomitą większością adresów. Jak dla mnie metoda jest OK - zaś chciałem zwrócić uwagi na małe niedoróbki tego regexpa. Niedoróbkami są "tylko i aż" dwie rzeczy: olewanie prostych nazw hostów (bez domen) i olewanie adresów IP podanych w postaci numerycznej.

Oczywiście regexp jest do małej modyfikacji - nie może się zaczynać od "^" i kończyć na "$" - w obu miejscach trzeba dane znaki zamienić na "\s" i po wrzuceniu tego regexpa do preg_replace powinno działać.
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #41





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

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


Nie doczytałeś, nie można.
Autor tematu ma problem ze swoim wyrażeniem, które zamienia link znajdujący się w atrybucie src znacznika img.
Go to the top of the page
+Quote Post
by_ikar
post
Post #42





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

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


Cytat(wNogachSpisz @ 8.11.2011, 23:23:38 ) *
Nie rozumiem tej nowomowy.
Działa czy nie działa?
Nie działa.
Po co komu coś, co nie działa?
Zrób porządnie, napisz posta, do tego czasu zamilcz.


Uważaj z tym ego, bo się rozdymasz i pękniesz kiedyś. To nie jest żadna namowa. Zadałeś pytanie @croc'owi:

Cytat
Pytam grzecznie, uprzejmie i konkretnie, co się stanie z takim przykładem:

Kod
<a href="#">this is some http://link.me link</a>


A ja udowodniłem że można takie coś rozwiązać podałem przykład nawet z masą linków. Działał przykład odnośnie tego co napisałeś? Działał. Napisałem że to nie jest gotowiec? Napisałem. Więc w czym problem? W tym że ze swoim parse_url wyskoczyłeś jak filip z konopi, ktoś ci napisał że bzdury piszesz a teraz się puszysz. W takim wypadku podaj autorowi tematu gotowiec, o którym piszesz do mnie żebym zamilkł jeżeli nie będę takowego posiadać. Nie odniosłem się do pierwszego posta w tym temacie, tylko do twojego posta i udowodniłem że jesteś w błędzie. Strasznym jesteś hipokrytą, twoje rozwiązanie wcale nie działa (parse_url) i nie zadziała, więc według tego co napisałeś:

Cytat
Po co komu coś, co nie działa?
Zrób porządnie, napisz posta, do tego czasu zamilcz.


PS prosił bym jakiegoś moda o uspokojenie @wNogachSpisz bo trochę przegina..

EDIT: na szybkiego działający przykład do znaczników o których napisał autor tematu, czyli gotowiec:

Kod
<?php

$str = '

<a href="http://example.com"> http://example.com </a> <br><br>

smoe text http://example.com smoe text <a href="http://example.com"> http://example.com </a> smoe text<br>
some text https://example.com some text <a href="https://example.com"> https://example.com </a> smoe text<br>
smoe text http://subdomian.example.com smoe text <a href="http://subdomian.example.com"> http://subdomian.example.com </a> smoe text<br>
some text https://subdomian.example.com some text <a href="https://subdomian.example.com"> https://subdomian.example.com </a> smoe text<br>
smoe text http://www.example.com smoe text <a href="http://www.example.com"> http://www.example.com </a> smoe text<br>
some text https://www.example.com some text <a href="https://www.example.com"> https://www.example.com </a> smoe text<br>
smoe text http://www.subdomian.example.com smoe text <a href="http://www.subdomian.example.com"> http://www.subdomian.example.com </a> smoe text<br>
some text https://www.subdomian.example.com some text <a href="https://www.subdomian.example.com"> https://www.subdomian.example.com </a> smoe text

<img src="http://example.com/file.jpg"> some text
<iframe src="http://example.com/"> some text http://example.com/ some text</iframe>

';

$replace = preg_replace_callback('#(?:<a[^>]*>.*?</a>|<iframe[^>]*>.*?</iframe>|<img[^>]*>|((f|ht)tp(s)?://[^\s]+))#is', 'callbackFunction', $str);

function callbackFunction($matches)
{
    if(!empty($matches[1]))
    {
        return '<a href="'.$matches[1].'"> '.$matches[1].' </a>';
    } else
    {
        return $matches[0];
    }
}

echo $replace;


rozwiązanie śmieszne, ale działające o co tak bardzo zabiega @wNogachSpisz. Da się jednym wyrażeniem? Ciekawe co tym razem wymyślisz i napiszesz że jest błędne.

Ten post edytował by_ikar 9.11.2011, 08:52:06
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #43





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

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


Bzdura.
Skoro można skonstruować takie wyrażenie, to dlaczego tego nie zrobisz?

Ten post edytował wNogachSpisz 9.11.2011, 11:48:23
Go to the top of the page
+Quote Post
by_ikar
post
Post #44





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

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


Cytat(wNogachSpisz @ 9.11.2011, 10:54:12 ) *
Bzdura.
Skoro można skonstruować takie wyrażenie, to dlaczego tego nie zrobisz?


Sory że to napisze ale jesteś totalnym ignorantem. Patrz na mój post wyżej, dałem ci gotowe wyrażenie które pomija tagi: img, a, iframe czyli te tagi o których wspomniał autor tego tematu.
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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: 30.12.2025 - 11:53