2010-11-18 13 views
9

Mam funkcję, która doda link <a href> przed linkiem i </a> po łączu. Jednak na niektórych stronach ulega uszkodzeniu. Jak ulepszyłbyś tę funkcję? Dzięki!PHP - Dodaj link do adresu URL w ciągu znaków

function processString($s) 
{ 
    // check if there is a link 

    if(preg_match("/http:\/\//",$s)) 
    { 
     print preg_match("/http:\/\//",$s); 


     $startUrl = stripos($s,"http://"); 

     // if the link is in between text 
     if(stripos($s," ",$startUrl)){ 
      $endUrl = stripos($s," ",$startUrl); 
     } 
     // if link is at the end of string 
     else {$endUrl = strlen($s);} 

     $beforeUrl = substr($s,0,$startUrl); 
     $url = substr($s,$startUrl,$endUrl-$startUrl); 
     $afterUrl = substr($s,$endUrl); 

     $newString = $beforeUrl."<a href=\"$url\">".$url."</a>".$afterUrl; 

     return $newString; 
    } 

    return $s; 
} 
+0

regex jest trochę zaniedbany, ale 99% z mojego wejścia będą miały odpowiednie adresy URL, jeżeli jakiekolwiek – AlexBrand

+4

Jakie strony internetowe to przerwa na? –

+0

Na początku testujesz również pod kątem https, ale później pomijasz "s". Nie wiem, jeśli to powoduje ten błąd, ponieważ nie wiem również, które strony są zepsute;) – KingCrunch

Odpowiedz

18
function processString($s) { 
    return preg_replace('/https?:\/\/[\w\-\.!~#?&=+\*\'"(),\/]+/','<a href="$0">$0</a>',$s); 
} 
+0

Myślę, że brakuje "=": nie powiedzie się, gdy adres URL zawiera parametry get. Właśnie dodałem go po "&" i teraz działa: 'preg_replace ('/ https?: \/\/[\ W \ - \.! ~? & = + \ * \'"(), \ /] +/',' $0 ', $ s) ' – Narcolessico

+4

Zapomniałeś o adresach z # wewnątrz - więc bardziej poprawną wersją jest' preg_replace ('/https?: \/\/[\ W \ - \.! ~ # ? & = + \ * \ '"(), \ /] + /', '$0', $ text)' –

+0

Właśnie zredagowałem odpowiedź, aby odzwierciedlić te dwa dodatki. –

1

Łamie dla wszystkich adresów URL, które zawierają "specjalnych" znaków HTML. Aby być bezpiecznym, przekaż trzy składniki ciągu znaków przez htmlspecialchars() przed ich łączeniem (chyba że chcesz zezwolić na HTML poza adresem URL).

1
function processString($s){ 
    return preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="$1">$1</a>', $s); 
} 

Znaleziona here

+0

kończy się niepowodzeniem:' http: //www.xyz.com/~this-does-notwork! ' – stillstanding

+0

dopasowuje" a ... a "- dziwny – AlexBrand

+0

Ten sam scenariusz, którego potrzebuję w Jquery/Javascript. Czy ktoś może pomóc? – Yuv

Powiązane problemy