Я пытаюсь закодировать текущий стандарт RFC 3986 и использую эту функцию:

function getUrl() {

      $url  = @( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] :  'https://'.$_SERVER["SERVER_NAME"];
      $url .= ( $_SERVER["SERVER_PORT"] !== 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
      $url .= $_SERVER["REQUEST_URI"];

      $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
      $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");

      return str_replace($entities, $replacements, urlencode($url));

    }

Добавлен URL: http://localhost/test/test-countdown/?city=hayden&eventdate=20160301 Возврат: http://localhost/test/test-countdown/?city=hayden&eventdate=20160301 Не кодируется с замененными // и &

0
Packy 18 Фев 2016 в 20:49

2 ответа

Лучший ответ

Если вы хотите закодировать URL (не сайт) в этом формате:

http%3A%2F%2Flocalhost%2Ftest%2Ftest-countdown%2F%3Fcity%3Dhayden%26eventdate%3D20160301

Используйте встроенную функцию php rawurlencode( $url ).

0
fusion3k 18 Фев 2016 в 17:56

Другие упоминали rawurlencode (), но проблема с вашим кодом заключается в том, что у вас есть массивы наоборот.

Переключайте свои массивы следующим образом:

function getUrl() {

  $url  = @( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] :  'https://'.$_SERVER["SERVER_NAME"];
  $url .= ( $_SERVER["SERVER_PORT"] !== 80 ) ? ":".$_SERVER["SERVER_PORT"] : "";
  $url .= $_SERVER["REQUEST_URI"];

  $entities = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");      
  $replacements = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');

  return str_replace($entities, $replacements, urlencode($url));
}
0
Rick 18 Фев 2016 в 18:44