2012-02-05 23 views
8

seguente codice viene utilizzato per trovare url da una stringa con php. Ecco il codice:Trova url da stringa con php

$string = "Hello http://www.bytes.com world www.yahoo.com"; 
preg_match('/(http:\/\/[^\s]+)/', $string, $text); 
$hypertext = "<a href=\"". $text[0] . "\">" . $text[0] . "</a>"; 
$newString = preg_replace('/(http:\/\/[^\s]+)/', $hypertext, $string); 
echo $newString; 

Beh, si vede un collegamento, ma se posso fornire qualche collegamento non funziona e anche se scrivo senza http: // allora non mostra collegamento. Voglio che qualunque link sia fornito dovrebbe essere attivo, come StackOverflow.com.

Qualsiasi aiuto per favore ..

+3

possibile duplicato di [PHP: espressioni regolari per ottenere un URL da una stringa] (http://stackoverflow.com/questions/2720805/php -regular-expression-to-get-a-url-da-a-string) – Gordon

risposta

17

un metodo di lavoro per il collegamento con HTTP/HTTPS/FTP/FTPS/SCP/SCP: $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?&_/]+!', "<a href=\"\\0\">\\0</a>",$str);

ho caldamente NON collega quando ha solo un punto, perché prenderà in considerazione i collegamenti PHP 5.2, ASP.NET, ecc., che è difficilmente accettabile.

Aggiornamento: se si desidera www. stringhe pure, date un'occhiata a this.

+1

well @axiomer, ma non è attivo se scrivo www.example.com – user1161867

+0

Aggiornato la mia soluzione con un link (non l'ho provato ma dovrebbe funzionare, penso). – axiomer

+0

GRAZIE MOLTO. È LAVORO :)) – user1161867

3

Se si desidera rilevare qualcosa di simile stackoverflow.com, allora si sta andando ad avere per verificare la presenza di tutti i possibili domini di primo livello per escludere qualcosa come Web 2.0, che è piuttosto long list. Eppure, questo è anche andare a corrispondere qualcosa come ASP.NET ecc

L'espressione regolare sarebbe simile a questa:

$hypertext = preg_replace(
    '{\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net)\b}mi', 
    '<a href="http://$1$2$3">$1$2$3</a>', 
    $text 
); 

Questo corrisponde solo domini che terminano in .com, .org e .net ... come detto in precedenza, si dovrà estendere questa lista per abbinare tutti i TLD

+0

Questo funziona solo per la porzione di dominio. Se la stringa include directory e/o file, il collegamento terminerà prima di quelli. – doubleJ

0

@axiomer tuo esempio non è stato funziona se link sarà in formato:

https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl

soluzione corretta:

preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?%=&_/]+!', "<a href=\"\\0\">\\0</a>", $content); 

produce:

<a href="https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl">https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl</a>