薩赫勒的方法是用6置換元素,不必要的字符圖案中的逸出,並在不希望的重複的字符有限量詞可怕旋繞。事實上,這種簡單的URL不能被糾正:http://example.com//path1
在項目中實現此更短,速度更快,更清潔,更可讀的方法來代替:
碼(Demo):
$urls=array(
"http://example.com//path/",
"http://example.com/path/?&",
"http://example.com/path/?¶m=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/?¶m=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
的字符串中。
請提交您已經嘗試過的內容 – Kainix
還沒有試過,我會盡快提交。 –