как удалить несколько косых черт в URI с помощью «PREG» или «HTACCESS»

как удалить несколько косых черт в URI с помощью «PREG» или «HTACCESS»

site.com/edition/new/// -> site.com/edition/new/


site.com/edition///новый/ -> site.com/edition/новый/

Благодарность


person Lelis    schedule 14.06.2011    source источник


Ответы (5)


использование символа плюса + в регулярном выражении означает появление одного или нескольких предыдущих символов. Таким образом, мы можем добавить его в preg_replace, чтобы заменить вхождение одного или нескольких / только одним из них.

   $url =  "site.com/edition/new///";

$newUrl = preg_replace('/(\/+)/','/',$url);

// now it should be replace with the correct single forward slash
echo $newUrl
person Ibu    schedule 14.06.2011
comment
Отличная идея, но как я могу выполнить проверку после «редакции». В этом примере $ url = site.com/edition///new///; $ newUrl = preg_replace ('/edition(\/+)/','/',$ url); я не знаю применить - person Lelis; 14.06.2011

Редактировать: Ха, я прочитал этот вопрос как «без preg», да ладно: 3

function removeabunchofslashes($url){
  $explode = explode('://',$url);
  while(strpos($explode[1],'//'))
    $explode[1] = str_replace('//','/',$explode[1]);
  return implode('://',$explode);
}

echo removeabunchofslashes('http://www.site.com/edition////new///');
person Scuzzy    schedule 14.06.2011

http://domain.com/test/test/ > http://domain.com/test/test

# Strip trailing slash(es) from uri
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+?)[/]+$ $1 [NC,R,L]

http://domain.com//test//test// > http://domain.com/test/test/

# Merge multiple slashes in uri
RewriteCond %{THE_REQUEST} ^[A-Z]+\ //*(.+)//+(.*)\ HTTP
RewriteRule ^ /%1/%2 [R,L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ //+(.*)\ HTTP
RewriteRule ^ /%1 [R,L]

Измените R на R = 301, если после тестирования все работает нормально...

Кто-нибудь знает, как сохранить двойную косую черту в запросе, используя вышеуказанный метод?

(Например: /тест//тест//?тест=тест//тест > /тест/тест/?тест=тест//тест)

person Mike    schedule 07.03.2012

Просто, проверьте этот пример:

$url ="http://portal.lojav1.local//Settings////messages";
echo str_replace(':/','://', trim(preg_replace('/\/+/', '/', $url), '/'));

выход :

http://portal.lojav1.local/Settings/messages
person Bruno Ribeiro    schedule 12.07.2016

person    schedule
comment
Хороший ответ. Не могли бы вы объяснить, как работает это регулярное выражение? - person Gihan; 15.12.2015
comment
В инструменте, связанном @ツLiverbool, вставьте ([^:])(\/{2,}) в качестве регулярного выражения, затем вставьте $url в качестве тестовой строки или любого другого URL-адреса, который вы хотите протестировать. - person briankip; 20.10.2017
comment
@Gilhan Последовательность [...] означает соответствие любому из этих символов. В этом случае [^:] означает соответствие любому символу, кроме двоеточия. Ведущий ^ отрицает последовательность. Эта последовательность заключена в круглые скобки, что делает ее «группой захвата», а захваченное значение можно использовать в подстановке как $1. Последовательность [\/]{2,} означает поиск двух или более косых черт. Поскольку все выражение ограничено косой чертой, совпадающая косая черта должна быть экранирована, что и делает обратная косая черта. Эта последовательность заключена в круглые скобки, поэтому она также захвачена, но это не обязательно. - person bseddon; 06.12.2019
comment
@Gilhan Обратите внимание, что пример, приведенный в ответе, не работает, если имеется более одной последовательности косых черт, например: example.com/def//git//ss, поскольку выражение будет соответствовать первому экземпляру. Чтобы решить эту проблему, следует использовать «жадную» директиву: preg_replace('/([^:])\/{2,}/g', '/') - person bseddon; 06.12.2019