PHP: как добавить косую черту в абсолютный URL - PullRequest
16 голосов
/ 27 марта 2011

У меня есть список абсолютных URL. Мне нужно убедиться, что у них всех есть косые черты, если это применимо. Итак:

Полагаю, мне нужно использовать регулярные выражения, но соответствующие URL-адреса - это боль. Надеялся на более простое решение. Идеи?

Ответы [ 5 ]

20 голосов
/ 27 марта 2011

Для этой очень специфической проблемы также может не использоваться регулярное выражение. Если ваш список длинный (несколько тысяч URL-адресов) и время вас не устраивает, вы можете вручную написать код этой очень простой манипуляции.

Это будет делать то же самое:

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

Это, конечно, не почти столь же элегантно или гибко, как регулярное выражение, но это позволяет избежать лишних затрат на анализ строки регулярного выражения и будет выполняться так быстро, как это сможет сделать PHP.
Возможно, он менее читабелен, чем регулярное выражение, хотя это зависит от того, насколько удобен читатель с синтаксисом регулярных выражений (некоторые люди могут найти его более читабельным).

Это, конечно, не проверит, что строка действительно является правильно сформированным URL (например, регулярное выражение zerkms), но вы уже знаете, что ваши строки в любом случае являются URL, так что это немного избыточно.

Хотя, если в вашем списке 10 или 20 URL, забудьте этот пост. Используйте регулярное выражение, разница будет равна нулю.

14 голосов
/ 27 марта 2011

Вместо того, чтобы делать это с помощью регулярных выражений, вы можете использовать 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;
3 голосов
/ 27 марта 2011
$url = 'http://www.domain.com';

$need_to_add_trailing_slash = preg_match('~^https?://[^/]+$~', $url);
1 голос
/ 21 ноября 2012

Возможно, это не самое элегантное решение, но оно работает как шарм.Сначала мы получаем полный 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;
1 голос
/ 27 марта 2011

Попробуйте это:

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

     $url = "$url" . "/";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...