替换/删除字符串中的子字符串

时间:2014-02-03 18:46:39

标签: php regex string str-replace

我有一个函数,我想从字符串中删除部分字符串。

我想删除以下可能放在域名前面的子字符串http:// ftp:// www. www2.

这是代码,但它不起作用,我可能会遗漏一些非常明显的代码。

    private function GetValidDomainName($domain)
{
    if(strpos($domain, 'http://'))
    {
        $this->domain = str_replace("http://", "", $domain);
    }
    if(strpos($domain, 'ftp://'))
    {
        $this->domain = str_replace("ftp://", "", $domain);
    }
    if(strpos($domain, 'www.'))
    {
        $this->domain = str_replace("www.", "", $domain);
    }
    if(strpos($domain, 'www2.'))
    {
        $this->domain = str_replace("www2.", "", $domain);
    }

    $dot = strpos($domain, '.'); 
    $this->domain = substr($domain, 0, $dot);
    $this->tld = substr($domain, $dot+1);
}

这是我在WHOIS检查域名可用性时使用的第一个功能,我有功能可以填写可用的字符并允许域名长度等,它们都可以工作,检查本身工作得很好,但只是这个功能没有做到它应该做的事情。

1 个答案:

答案 0 :(得分:1)

<强>理论值:

您需要查看strict comparison operator

if(strpos($domain, 'http://') === 0) 

......等等。

那是因为strpos将返回字符串中出现的(第一个)位置,如果找不到子字符串,则返回FALSE

在您的情况下,我希望该方法将返回0,意味着在开头找到子字符串,或者如果找不到则FALSE。除非您使用严格比较运算符,否则两者都将在PHP中评估为FALSE

<强>实践:

您根本不需要进行strpos()检查,因为str_replace()只有在需要替换的情况下才有效。你可以使用它:

$this->domain = str_replace(array(
    'http://', 'ftp://', 'www1', 'www2'
), '', $domain);

但是,除非您确保网址不会多次包含http://(或其中一个),否则此功能无效。意味着以下网址会破坏:

http://test.server.org/redirect?url=http://server.org

为了让它稳定,我会使用preg_replace()

$pattern = '~^((http://|ftp://~|www1\.|www2\.))~'
$this->domain = preg_replace($pattern, '', $domain);

上面的模式只有当它们出现在字符串的开头时才会删除子字符串。