簡體   English   中英

PHP:如何向絕對URL添加尾部斜杠

[英]PHP: how to add trailing slash to absolute URL

我有一個絕對URL列表。 我需要確保它們都有斜杠,如果適用的話。 所以:

我猜我需要使用正則表達式,但匹配的URL很痛苦。 希望有一個更簡單的解決方案。 想法?

對於這個非常具體的問題,根本不使用正則表達式也可能是一個選項。 如果您的列表很長(幾千個URL)並且時間有任何問題,您可以選擇手動編碼這個非常簡單的操作。

這將做同樣的事情:

$str .= (substr($str, -1) == '/' ? '' : '/');

它當然不像正則表達式那樣優雅或靈活,但它避免了解析正則表達式字符串的開銷,並且它將以PHP能夠執行的速度運行。
它可以說比正則表達式更不易讀,雖然這取決於讀者對正則表達式語法的舒適程度(有些人可能會覺得它更具可讀性)。

它肯定不會檢查字符串是否是一個格式正確的URL(例如zerkms的正則表達式),但你已經知道你的字符串仍然是URL,所以這有點多余。

但是,如果您的列表類似於10或20個URL,請忘記這篇文章。 使用正則表達式,差異將為零。

您可以使用parse_url()來執行此操作,而不是使用正則表達式執行此操作。 例如:

$url = parse_url("http://www.example.com/ab/abc.html?a=b#xyz");
if(!isset($url['path'])) $url['path'] = '/';
$surl = $url['scheme']."://".$url['host'].$url['path'].'?'.$url['query'].'#'.$url['fragment'];
echo $surl;
$url = 'http://www.domain.com';

$need_to_add_trailing_slash = preg_match('~^https?://[^/]+$~', $url);

這可能不是最優雅的解決方案,但它就像一個魅力。 首先我們得到完整的URL,然后檢查它是否有一個尾隨斜杠。 如果沒有,請檢查是否沒有查詢字符串,它不是實際文件,也不是實際目錄。 如果網址滿足所有這些條件,我們會執行301重定向並添加尾部斜杠。

如果您不熟悉PHP標頭...請注意,在此代碼之前不能有任何輸出 - 甚至不是空格。

$url = $_SERVER['REQUEST_URI'];
$lastchar = substr( $url, -1 );
if ( $lastchar != '/' ):
    if ( !$_SERVER['QUERY_STRING'] and !is_file( $_SERVER['DOCUMENT_ROOT'].$url ) and     !is_dir( $_SERVER['DOCUMENT_ROOT'].$url ) ):
        header("HTTP/1.1 301 Moved Permanently");
        header( "Location: $url/" );
    endif;
endif;

試試這個:

if (!preg_match("/.*\/$/", $url)) {

     $url = "$url" . "/";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM