Autor Zpráva
temistokles
Profil
Ahoj,

mám nasledovný regáč:

 
$text = ereg_replace('[^(href=|href="|(<a(.*)>))](((f|ht){1}tp://)[-a-zA-Z0-9@ :%_\+.~#?&//=]+)',
          '<a href="\\1" target="_blank">\\1</a>', $text);


Mal by nahradiť výskyt URL adresy (v prípade, že už nie je odkazom) za odkaz. Funguje fajn, avšak zlyhá, ak sa pred samotnou adresou nenachádza biely znak :-(. Snažím sa to už nejakú dobu neúspešne riešiť. Vedel by niekto pomôcť?

Vopred diki, Temi.
Taps
Profil
temistokles
zkus použít trim
temistokles
Profil
Taps
Trim ma medzier zbaví, avšak regáč zlyhá napríklad na:

BlaBla<br>http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum =9&topic=76341


Teda v prípade, že medzera chýba.
Joker
Profil
temistokles
Asi to je neregulérní regulární výraz :o)))

Ne, sice mi chvíli trvalo ho pochopit, ale selže vcelku logicky:
'[^(href=|href="|(<a(.*)>))](((f|ht){1}tp://)[-a-zA-Z0-9@ :%_\+.~#?&//=]+)'

Ten výraz přeci říká, že na začátku musí být něco, co není href=, href=" ani <a(cokoliv nebo nic)> a až potom následuje http nebo ftp.
temistokles
Profil
Keďže som dospel k názoru, že POSIX výrazy sú pažravé (greedy -- googlenie to povrdzuje), snažil som sa použiť preg_* výrazy, ale opäť som narazil na problém. Mám nasledujúci kód:

  $text = preg_replace('`[^(href=|href=")]([<a(.*)>(.*)</a>|>])?((ftp|http)://[- a-zA-Z0-9@:%_\+.~#?&/=]+)`',
          '\\1<a href="\\2" target="_blank">\\2</a>', $text);



Pre vstup s môjho predchodzieho príspevku to funguje _takmer_ fajn...


Vráti to:

BlaBla<br<a href="http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&to pic=76341" target="_blank">http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=76341http://diskuse.jakp&hellip;forum=9&topic=76341</a>



Problém je teda v jednom chýbajúcom zobáčiku / väčšítku, ktoré tam za svet neviem dostať :(.

Poradí niekto?
temistokles
Profil
Joker
Hmm, to máš pravdu, skúsim to ešte trochu prekopať :).

Edit:
Keď tak nad tým uvažujem, nespĺňa aj "nič" to, že sa to nerovná href=", href=, <a (niečo)> ? :)

Edit2:
Tak podľa všetkého (niekoľkých testov), "nič" skutočne nie je niečo :-D. Každopádne ma riešenie zatiaľ nenapadá...
peta
Profil
http://www.volny.cz/peter.mlich/www.htm#main7
v knihovne reg. vyrazu je nekoli takovych pro odkaz.

Nebylo by jednodussi pouzit 2 vyrazy, kdy jednim nahradis vsechny 'a href=url' na 'url' a pak zpetne na odkazy? Ja jen, ze hledat v textu slozity vyraz, to je rychlejsi hledat 2 jednodussi.

(f|ht){1}tp
nebylo by jednodussi
(ftp|http)
temistokles
Profil
Nebylo by jednodussi pouzit 2 vyrazy, kdy jednim nahradis vsechny 'a href=url' na 'url' a pak zpetne na odkazy? Ja jen, ze hledat v textu slozity vyraz, to je rychlejsi hledat 2 jednodussi.
Každopádne by som navrhovaným nahradením prišiel o informáciu v popiskoch odkazov (zachovali by sa mi len samotné adresy). To nie je práve žiadúca črta :).

(f|ht){1}tp
nebylo by jednodussi
(ftp|http)

Ani jeden zo spôsobov mi nepríde komplikovanejší :). Rýchlosť som netestoval, nepredpokladám, že by v nej však mal byť nejaký radikálny rozdiel...

http://www.volny.cz/peter.mlich/www.htm#main7
v knihovne reg. vyrazu je nekoli takovych pro odkaz.

Skúšal som toho pomerne hodne, každopádne sa neviem zbaviť toho problému, že za URL adresou sa musí nachádzať nejaký znak...
lordfrikk
Profil
Keďže som dospel k názoru, že POSIX výrazy sú pažravé (greedy -- googlenie to povrdzuje), snažil som sa použiť preg_* výrazy,...

I PCRE výrazy jsou defaultně greedy, tak nevím jak sis vlastně pomohl?
temistokles
Profil
I PCRE výrazy jsou defaultně greedy, tak nevím jak sis vlastně pomohl?
Pri PCRE to však nie je problém zmeniť :). Aspoň neviem o spôsobe, ako by to pre POSIX šlo...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: