如何在PHP中从用户输入中删除URL协议和斜杠

d4so4syb  于 2023-03-28  发布在  PHP
关注(0)|答案(9)|浏览(197)

示例用户输入

http://example.com/
http://example.com/topic/
http://example.com/topic/cars/
http://www.example.com/topic/questions/

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

example.com
example.com/topic/
example.com/topic/cars/
www.example.com/topic/questions/
pbwdgjma

pbwdgjma1#

ereg_replace现在已被弃用,因此最好用途:

$url = preg_replace("(^https?://)", "", $url );

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

inkz8wg9

inkz8wg92#

你应该使用一个“disallowed”术语的数组,并使用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;
}
1sbrub3j

1sbrub3j3#

我建议使用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);
?>

以上示例将输出:

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

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

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

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

    > www.domain.com/topic/questions/

干杯

jjhzyzn0

jjhzyzn04#

创建阵列:

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

并替换为空字符串:

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

它看起来像这样:

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

如果你的haystack(输入)是一个字符串,并且你用一个字符串替换了数组中的needle,那么Str_replace将返回一个字符串。这很好,这样你就可以避免所有额外的循环。

7eumitmz

7eumitmz5#

哇。我从谷歌来到这里,期待找到一个班轮复制和粘贴!
你不需要一个函数来完成这个任务,因为已经有一个函数了。

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

在这个例子中,explode()将返回一个数组:

["https:", "anyurl.any.tld/any/directory/structure"]

我们需要第二个元素。它将处理http、https、ftp或几乎任何URI,而不需要正则表达式。
https://www.php.net/manual/en/function.explode.php
如果你想要一个函数:

function removeProtocols($uri) { return explode("//", $uri, 2)[1]; }

编辑:请看来自哈里·刘易斯的用户评论...这是我现在最喜欢的方式。

nxagd54h

nxagd54h6#

您可以使用preg_replace的 * 正则表达式 * 在一行中删除https和http:

fn (string $url): string
    => preg_replace('~^https?://~', '', $url);
2nbm6dog

2nbm6dog7#

你可以使用PHP的解析URL功能。这将适用于所有协议,甚至是ftp://或https://
Eiter获取协议组件并从URL中substr它,或者只是将其他部分连接在一起...
http://php.net/manual/de/function.parse-url.php

e5njpo68

e5njpo688#

<?php
// user input
$url = 'http://www.example.com/category/website/wordpress/wordpress-security/';
$url0 = 'http://www.example.com/';
$url1 = 'http://www.example.com/category/';
$url2 = 'http://www.example.com/category/website/';
$url3 = 'http://www.example.com/category/website/wordpress/';

// print_r(parse_url($url));
// echo parse_url($url, PHP_URL_PATH);

$removeprotocols = array('http://', 'https://');

echo '<br>' . str_replace($removeprotocols,"",$url0);
echo '<br>' . str_replace($removeprotocols,"",$url1);
echo '<br>' . str_replace($removeprotocols,"",$url2);
echo '<br>' . str_replace($removeprotocols,"",$url3);

?>
swvgeqrz

swvgeqrz9#

这个解决方案对我很有效,短的。

parse_url($url, PHP_URL_HOST);

相关问题