PHP检查用户名中是否包含URL并替换

时间:2018-08-15 17:45:37

标签: php

我想检查用户名是否包含域名或网站。 很多时候,用户会通过这种方式为自己或其他网站做广告。

所以我想用*代替URL

我发现

$url = 'Testusername google.com';
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
    $regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
    $regex .= "(\:[0-9]{2,5})?"; // Port 
    $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 

       if(preg_match("/^$regex$/i", $url)) // `i` flag for case-insensitive
       {     
               $url = str_replace($url, $url, '*');
               echo $url;
               return true; 
       } else {
           echo $url;
       }

找到url很好,但是如何仅将名称中的域名替换为*,而不是全部替换?

所以我想要

Testusername *

3 个答案:

答案 0 :(得分:1)

要替换正则表达式,请使用preg_replace而不是preg_match,并使用组仅提取用户名的有效部分。

$username = 'Testusername google.com';
$regex = '/^(.*?)';
$regex .= "((https?|ftp)\:\/\/)?"; // SCHEME 
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
$regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
$regex .= "(\:[0-9]{2,5})?"; // Port 
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 
$regex .= '(.*?)$/i';
$username = preg_replace($regex, '$1 * $13', $username);
echo $username; // Testusername *

如果您需要知道用户名包含一个URL并进行了替换,则可以使用$count参数来确定发生了多少次替换。

$count = 0;
$username = preg_replace($regex, '$1 * $13', $username, -1, $count);
if ($count > 0) {
    // url replaced in username
}

答案 1 :(得分:1)

尝试像这样使用preg_replace()

$url = 'Testusername google.com';
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
    $regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
    $regex .= "(\:[0-9]{2,5})?"; // Port 
    $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 

     echo preg_replace("/$regex$/i", '*', $url);

more about preg_replace can be found here

答案 2 :(得分:0)

应该这样做-您需要分开用户名和url,以及其他一些更改。.......

$username = 'Testusername google.com';
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
$regex .= "([a-z0-9-.]*)\.([a-z]{2,3})"; // Host or IP 
$regex .= "(\:[0-9]{2,5})?"; // Port 
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 

   if(preg_match("/^$regex$/i", $username,$matches)) // `i` flag for case-insensitive
   {     
        foreach($matches as $key => $url){
           $username = str_replace($url, '*', $username);
         }
         echo $username;
         return true; 
   } else {
       echo $username;
   }