Intereting Posts

Как исправить неверный URL-адрес в PHP?

Использование PHP, Как я могу автоматически исправить неверный URL-адрес, который выглядит следующим образом:

/db/?param1=sas23456sdfd&param2=1368115104&parama3=more/resource or... /db?param1=sas23456sdfd&param2=1368115104&parama3=more/resource 

и переставить его обратно в надлежащий порядок:

 /db/resource/?param1=sas23456sdfd&param2=1368115104&parama3=more or... /db/resource?param1=sas23456sdfd&param2=1368115104&parama3=more 

Прежде чем вы спросите, причина неправильного URL-адреса полностью не контролируется, вызванная клиентской библиотекой, которая настаивает на том, чтобы глупо добавить конечную косую черту и больше конечных точек после исходных параметров строки запроса. К счастью, я передаю запросы через PHP-обратный прокси-скрипт, поэтому я могу это исправить. Пожалуйста, обратите внимание:

  1. Строка запроса может быть или не быть
  2. Строку запроса иногда можно правильно разместить
  3. Имена и значения параметров строки запроса будут отличаться
  4. Количество параметров строки запроса может измениться
  5. Строка запроса может не всегда следовать за «/» (db /? Param = val или db? Param = val)
  6. У искаженного URL-адреса всегда будет шаблон «? Param (s) = value /"

Любые идеи о том, как исправить этот беспорядок с помощью PHP?

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

Но есть регулярное выражение, которое может вам помочь.

 /(.*?)(\/)?(\?.*)(\/.*)/ 

Это соответствует неверным строкам в примерах и не соответствует строкам результата. См. Рабочую демонстрацию в Rubular .

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

 $matches = array(); $is_malformed = preg_match('/(.*?)(\/)?(\?.*)(\/.*)/', $_SERVER['REQUEST_URI'], $matches); if($is_malformed) { $_SERVER['REQUEST_URI'] = $matches[1] . $matches[4] . $matches[2] . $matches[3]; } 

Я подошел к проблеме немного более обобщенно в другом вопросе и с помощью @Yogesh Suthar придумал это как рабочее решение (улучшения приветствуются):

 $qs_match = array(); $is_malformed = preg_match('$\?(.*?)\/$s', $_SERVER['REQUEST_URI'], $qs_match); if($is_malformed) { $uri_parts = explode('?',$_SERVER['REQUEST_URI']); //break apart at the first query string param //per https://stackoverflow.com/questions/4250794/simple-php-regex-question $_SERVER['REQUEST_URI'] = $uri_parts[0].preg_replace('/^[^\/]*\//' , '/', $uri_parts[1]).'?'.$qs_match[1]; //recombined but modified part 2 }