如何从php中的用户输入中删除http,https和斜杠

Blu*_*lur 39 php function preg-replace

示例用户输入

http://domain.com/
http://domain.com/topic/
http://domain.com/topic/cars/
http://www.domain.com/topic/questions/
Run Code Online (Sandbox Code Playgroud)

我想要一个PHP函数来使输出像

domain.com
domain.com/topic/
domain.com/topic/cars/
www.domain.com/topic/questions/
Run Code Online (Sandbox Code Playgroud)

让我知道 :)

小智 112

ereg_replace 现已弃用,因此最好使用:

$url = preg_replace("(^https?://)", "", $url );
Run Code Online (Sandbox Code Playgroud)

这将删除http://https://


Jac*_*kin 32

您应该使用一组"不允许"的术语并使用strposstr_replace从传入的URL中动态删除它们:

function remove_http($url) {
   $disallowed = array('http://', 'https://');
   foreach($disallowed as $d) {
      if(strpos($url, $d) === 0) {
         return str_replace($d, '', $url);
      }
   }
   return $url;
}
Run Code Online (Sandbox Code Playgroud)

  • -1这是**编码不佳的一个很好的例子** (3认同)
  • 如果URL是这样的:`http://domain.com/topic/https:// more /`?这是一个有效路径的有效网址,但这种方法会以(我认为)OP无意的方式破坏它. (2认同)

Mad*_*aks 23

我建议使用PHP给你的工具,看看parse_url.

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);
?>
Run Code Online (Sandbox Code Playgroud)

上面的例子将输出:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path
Run Code Online (Sandbox Code Playgroud)

这听起来像你至少host+ path(根据需要添加其他,例如query):

$parsed = parse_url('http://www.domain.com/topic/questions/');

echo $parsed['host'], $parsed['path'];

    > www.domain.com/topic/questions/
Run Code Online (Sandbox Code Playgroud)

干杯


小智 8

创建一个数组:

$remove = array("http://","https://");

并替换为空字符串:

str_replace($remove,"",$url);

它看起来像这样:

function removeProtocol($url){
    $remove = array("http://","https://");
    return str_replace($remove,"",$url);
}
Run Code Online (Sandbox Code Playgroud)

如果您的 haystack(输入)是字符串并且您用字符串替换数组中的针,则 Str_replace 将返回一个字符串。这很好,因此您可以避免所有额外的循环。

快乐编码!


mik*_*rce 6

哇。我从谷歌来到这里,希望找到一个可以复制和粘贴的衬垫!

您不需要一个函数来执行此操作,因为已经存在一个函数。做就是了:

echo explode("//", "https://anyurl.any.tld/any/directory/structure", 2)[1];
Run Code Online (Sandbox Code Playgroud)

在此示例中,explode() 将返回一个数组:

["https:", "anyurl.any.tld/any/directory/structure"]
Run Code Online (Sandbox Code Playgroud)

我们想要第二个元素。这将处理 http、https、ftp 或几乎任何 URI,而不需要正则表达式。

https://www.php.net/manual/en/function.explode.php

如果你想要一个功能:

function removeProtocols($uri) { return explode("//", $uri, 2)[1]; }
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅 Harry Lewis 的用户评论...这是我现在最喜欢的方法。

  • 要解决额外双斜杠的可能性,您可以使用“explode()”的第三个参数“$limit”,如下所示:“explode('//', $url, 2);” (3认同)
  • 爱它。对于我需要做的事情来说简单而有效。 (2认同)

min*_*naz 5

您可以使用ereg_replace删除一行中的https和http:

$url = ereg_replace("(https?)://", "", $url);
Run Code Online (Sandbox Code Playgroud)