2011-07-21 72 views
1

返回URLS我有一個字符串的PHP數組它看起來像這樣從PHP字符串

Array 
(
    [1] => Lorem ipsum dolor sit amet http://www.google.com/search?q=stackoverflow consectetur adipiscing elit. 
    [2] => Phasellus tempor vehicula fringilla. www.google.com/search?q=stackoverflow&ie=utf-8 
    [3] => google.com/search?q=stackoverflow&ie=utf-8 Aenean in cursus libero. 
); 

網址將是各種形式的,我需要的是這些鏈接的數組。像這樣的:

Array 
(
    [1] => http://www.google.com/search?q=stackoverflow 
    [2] => http://www.google.com/search?q=stackoverflow&ie=utf-8 
    [3] => http://www.google.com/search?q=stackoverflow&ie=utf-8 
); 
+0

您是否認爲互聯網歷史上沒有人不得不從字符串解析URL,並且這樣做的代碼從未被共享過?好消息!已完成,代碼已共享數千次!前往最近的搜索框。 –

+1

重複。 http://stackoverflow.com/questions/1113840/php-remove-url-from-string 這會有所幫助。 –

+0

既不以「google.com」開頭,也不以「www.google.com」開頭的字符串是有效的網址。提取所有可能的變化將是困難和模糊的。海事組織你應該首先確保這些網址是有效的。 – schneck

回答

2

代碼爲您提供:

$pattern = '/((https?|ftp)\:(\/\/)|(file\:\/{2,3}))?(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((([a-zA-Z0-9]+)(\.)?)+)(\.)(com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|[a-z]{2}))([\/][\/a-zA-Z0-9\.]*)*([\/]?(([\?][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)([\&][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)*))?/'; 

$a = array(
    'Lorem ipsum dolor sit amet http://www.google.com/search?q=stackoverflow consectetur adipiscing elit.', 
    'Phasellus tempor vehicula fringilla. www.google.com/search?q=stackoverflow&ie=utf-8', 
    'google.com/search?q=stackoverflow&ie=utf-8 Aenean in cursus libero.', 
); 

$urls = array(); 

foreach($a as $line) 
{ 
    if(!preg_match($pattern, $line, $match)) 
     continue; 

    $urls[] = $match[0]; 
} 

var_dump($urls); 

正則表達式是從here採取和糾正了一下。

+0

感謝您快速回答! – Povylas

+0

我測試了這個腳本,發現了一些弱點。它被特殊符號卡住,如 - 或_或?並且如果url結束時不能很好地處理.something(除了.html) – Povylas

0

你應該寫一個適當的正則表達式來實現這一點。看看this