Использование PHP, Как я могу автоматически исправить неверный URL-адрес, который выглядит следующим образом:
/db/?param1=sas23456sdfd¶m2=1368115104¶ma3=more/resource or... /db?param1=sas23456sdfd¶m2=1368115104¶ma3=more/resource
и переставить его обратно в надлежащий порядок:
/db/resource/?param1=sas23456sdfd¶m2=1368115104¶ma3=more or... /db/resource?param1=sas23456sdfd¶m2=1368115104¶ma3=more
Прежде чем вы спросите, причина неправильного URL-адреса полностью не контролируется, вызванная клиентской библиотекой, которая настаивает на том, чтобы глупо добавить конечную косую черту и больше конечных точек после исходных параметров строки запроса. К счастью, я передаю запросы через PHP-обратный прокси-скрипт, поэтому я могу это исправить. Пожалуйста, обратите внимание:
Любые идеи о том, как исправить этот беспорядок с помощью 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 }