PHP规范化远程url';s

PHP规范化远程url';s,php,html,url,encoding,formatting,Php,Html,Url,Encoding,Formatting,是否有任何快速函数可以将:HtTp://www.ExAmPle.com/blah转换为http://www.example.com/blah 基本上,我希望降低url中不区分大小写的部分。不,您必须自己编写代码 但是您可以使用将URL拆分为多个部分。我相信这个类将满足您的需求。下面是一个解决方案,它扩展了@ThiefMaster已经提到的内容: function urltolower($url){ if (($_url = parse_url($url)) !== false){ // v

是否有任何快速函数可以将:
HtTp://www.ExAmPle.com/blah
转换为
http://www.example.com/blah


基本上,我希望降低url中不区分大小写的部分。

不,您必须自己编写代码


但是您可以使用将URL拆分为多个部分。

我相信这个
类将满足您的需求。

下面是一个解决方案,它扩展了@ThiefMaster已经提到的内容:

function urltolower($url){
  if (($_url = parse_url($url)) !== false){ // valid url
    $newUrl = strtolower($_url['scheme']) . "://";
    if ($_url['user'] && $_url['pass'])
      $newUrl .= $_url['user'] . ":" . $_url['pass'] . "@";
    $newUrl .= strtolower($_url['host']) . $_url['path'];
    if ($_url['query'])
      $newUrl .= "?" . $_url['query'];
    if ($_url['fragment'])
      $newUrl .= "#" . $_url['fragment'];
    return $newUrl;
  }
  return $url; // could return false if you'd like
}
注意:没有经过战斗测试,但它应该能让你继续前进。

因为你要求“快速”,这里有一个单行程序可以完成这项工作:

$url = 'HtTp://User:Pass@www.ExAmPle.com:80/Blah';

echo preg_replace_callback(
  '#(^[a-z]+://)(.+@)?([^/]+)(.*)$#i',
  create_function('$m',
                  'return strtolower($m[1]).$m[2].strtolower($m[3]).$m[4];'),
  $url);
产出:

http://User:Pass@www.example.com:80/Blah
编辑/添加:

我已经测试过,这个版本比使用带匿名函数的preg_replace_回调快55%左右:

echo preg_replace(
  '#(^[a-z]+://)(.+@)?([^/]+)(.*)$#ei',
  "strtolower('\\1').'\\2'.strtolower('\\3').'\\4'",
  $url);

这似乎是一种明智的方法,因为与使用strtolower相比,它使开发人员能够更好地控制流程,这可能会破坏URI中区分大小写的部分。如果您希望快速完成某项任务,或者希望自己完成某项任务,这似乎是一种过火的做法。仅供参考,如果有用户但没有通过,这将中断。或者如果user、pass、query或fragment的值为零。而且,在任何情况下都会发出警告。在这种情况下,应该执行“if(isset($var))”而不是“if($var)”,在这种情况下,这些变量可能未设置,如果设置,则可能有效,但计算结果为零。此外,还将删除端口。我不会声称我的regex one衬里是防弹的,但它没有这些问题。祝你好运。这看起来更可靠,谢谢预先确定的:preg_replace():不推荐使用/e修饰符,请改用preg_replace_回调