2009-07-17 13 views
5

Od pewnego czasu szukałem kodu, aby uzyskać adres URL z ciągu znaków za pomocą PHP. Zasadniczo próbuję uzyskać skróconą adres URL z wiadomości, a następnie wykonuję żądanie HEAD, aby znaleźć rzeczywisty link.Uzyskaj adres URL z ciągu znaków

Ktoś ma dowolny kod, który zwraca adresy URL z ciągów?

Z góry dziękuję.

Edit Ghost Dog:

Oto próbka tego, co ja parsowania:

$test = "I am testing this application for http://test.com YAY!"; 

I tu jest odpowiedź dostałem, że go rozwiązać:

$regex = '$\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$i'; 

preg_match_all($regex, $string, $result, PREG_PATTERN_ORDER); 
$A = $result[0]; 

foreach($A as $B) 
{ 
    $URL = GetRealURL($B); 
    echo "$URL<BR>";  
} 


function GetRealURL($url) 
{ 
    $options = array(
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_HEADER   => true, 
     CURLOPT_FOLLOWLOCATION => true, 
     CURLOPT_ENCODING  => "", 
     CURLOPT_USERAGENT  => "spider", 
     CURLOPT_AUTOREFERER => true, 
     CURLOPT_CONNECTTIMEOUT => 120, 
     CURLOPT_TIMEOUT  => 120, 
     CURLOPT_MAXREDIRS  => 10, 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 
    return $header['url']; 
} 

Zobacz odpowiedź dotyczącą szczegółów.

+0

jak pokazać przykład tego, co ponowna analiza – ghostdog74

Odpowiedz

10

Kod ten może być pomocny (patrz ostatni post MadTechie za):

http://www.phpfreaks.com/forums/index.php/topic,245248.msg1146218.html#msg1146218

<?php 
$string = "some random text http://tinyurl.com/9uxdwc some http://google.com random text http://tinyurl.com/787988"; 

$regex = '$\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$i'; 

preg_match_all($regex, $string, $result, PREG_PATTERN_ORDER); 
$A = $result[0]; 

foreach($A as $B) 
{ 
    $URL = GetRealURL($B); 
    echo "$URL<BR>"; 
} 


function GetRealURL($url) 
{ 
    $options = array(
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_HEADER   => true, 
     CURLOPT_FOLLOWLOCATION => true, 
     CURLOPT_ENCODING  => "", 
     CURLOPT_USERAGENT  => "spider", 
     CURLOPT_AUTOREFERER => true, 
     CURLOPT_CONNECTTIMEOUT => 120, 
     CURLOPT_TIMEOUT  => 120, 
     CURLOPT_MAXREDIRS  => 10, 
    ); 

    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $content = curl_exec($ch); 
    $err  = curl_errno($ch); 
    $errmsg = curl_error($ch); 
    $header = curl_getinfo($ch); 
    curl_close($ch); 
    return $header['url']; 
} 

?> 
+0

Tak, to było dokładnie to, czego potrzebowałem –

2

Coś jak:

$matches = array(); 
preg_match_all('/http:\/\/[a-zA-Z0-9.-]+\/[a-zA-Z0-9.-]+/', $text, $matches); 
print_r($matches); 

Musisz dostroić regexp, aby uzyskać dokładnie to, co chcesz.

Aby uzyskać adres URL się, należy rozważyć coś tak prostego jak:

curl -I http://url.com/path | grep Location: | awk '{print $2}'

+0

bez potrzeby grep: curl -I http://url.com/path | awk '/ Location/{print $ 2}' – ghostdog74

Powiązane problemy