2017-03-19 52 views
0

以下是需要加以清理一些例如網址:如何清理一堆url而不必寫多個str替換語句?

而不必寫str_replace()多次,有沒有辦法清理網址?

+1

請提交您已經嘗試過的內容 – Kainix

+0

還沒有試過,我會盡快提交。 –

回答

1

薩赫勒的方法是用6置換元素,不必要的字符圖案中的逸出,並在不希望的重複的字符有限量詞可怕旋繞。事實上,這種簡單的URL不能被糾正:http://example.com//path1

在項目中實現此更短,速度更快,更清潔,更可讀的方法來代替:

碼(Demo):

$urls=array(
    "http://example.com//path/", 
    "http://example.com/path/?&", 
    "http://example.com/path/?&param=one", 
    "http://example.com///?&", 
    "http://example.com/path/subpath///?param=one&"); 
$urls=preg_replace(
    ['/(?<!:)\/{2,}/','/\?&/','/[?&]$/'],['/','?',''],$urls); 
var_export($urls); 

輸出:

array (
    0 => 'http://example.com/path/', 
    1 => 'http://example.com/path/', 
    2 => 'http://example.com/path/?param=one', 
    3 => 'http://example.com/', 
    4 => 'http://example.com/path/subpath/?param=one', 
) 

模式的解釋:

/(?<!:)\/{2,}/匹配2個或多個斜線,前面沒有冒號;用單斜槓替換。

/\?&/匹配一個問號,後跟&符號;用問號替換。

/[?&]$/匹配最後一個字符如果是問號或&符;去掉。


而且,這裏是我的作爲在URL解析的方法:(Demo

代碼:

$urls=array(
    "http://example.com//path//to///dir////4/ok", 
    "http://example.com/path/?&&", 
    "http://example.com/path/?&param=one", 
    "http://www.example.com///?&", 
    "http://example.com/path/subpath///?param=one&"); 
foreach($urls as $url){ 
    $a=parse_url($url); 
    $clean_urls[]="{$a["scheme"]}://{$a["host"]}". // no problems expected from these elements 
     preg_replace('~/+~','/',$a["path"]).  // reduce multiple consecutive slashes to single slash 
     (isset($a["query"]) && trim($a["query"],'&')!=''?'?'.trim($a["query"],'&'):''); // handle querystring 
}  
var_export($clean_urls); 

輸出:

array (
    0 => 'http://example.com/path/to/dir/4/ok', 
    1 => 'http://example.com/path/', 
    2 => 'http://example.com/path/?param=one', 
    3 => 'http://www.example.com/', 
    4 => 'http://example.com/path/subpath/?param=one', 
) 

的URL組件處理說明:

path元素上的preg_replace()模式將匹配1個或多個斜槓,並用單斜槓替換它們。這也可以通過使用~/+(?=/)~~(?<=/)/+~和一個空的替換字符串來實現,但查找週期至少比不查看模式慢2.5倍。

query處理線具有的條件是首先檢查query元素存在,那麼......

如果是的話,它會從兩端修剪無限連字號,檢查修整值不爲空的內聯。任何符合條件的字符串都將被剪裁爲「&」符號,並帶有一個問號。

如果不是,則將一個空字符串附加到要推入到$clean_urls的字符串中。

0

該溶液,將有利於你:

<?php 


// I merged your examples in this URL 
$url= "http://example.com//path/?&param=value"; 
// Separate URL 
$parsed = parse_url($url); 
// Path cleanup 
$path = trim($parsed['path'],'/'); 
// Query string cleanup 
$query = trim($parsed['query'],'&'); 
// Concatenate the URL parts 
echo sprintf("%s://%s/%s?%s",$parsed['scheme'],$parsed['host'],$path,$query); 
+0

我喜歡你的方法,但是如果在'http://example.com//path1//path2////?&param = value失敗&'http://sandbox.onlinephpfunctions.com/code/29f3752109400997eedadf38bb05ad02137ceae6 – mickmackusa

+0

使用URL解析器絕對是一種優越的方法。這裏的實現並不完美,但對於強大的實現來說,這是一個好的開始。 +1 – Amadan