使用正则表达式进行URL验证/清理

时间:2014-07-12 19:12:42

标签: php regex url

我有点超出我的深度,但相信我现在正走在正确的轨道上。我想获取用户提供的URL并将它们存储在数据库中,以便可以在用户配置文件页面上使用这些链接。

现在,我希望用户提供的链接将用于社交媒体网站,Facebook等。在寻找安全存储用户提供的URL的解决方案时,我找到了这个页面http://electrokami.com/coding/use-php-to-format-and-validate-a-url-with-these-easy-functions/。代码有效但似乎几乎删除了所有内容。如果我使用“www.example.com/user.php?u=borris”,则只返回example.com有效。

然后我发现了正则表达式并找到了这行代码

/(?:https?:\/\/)?(?:www\.)?facebook\.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-\.]*)/

来自此网站https://gist.github.com/marcgg/733592和另一个堆叠溢出帖子Check if a string contains a url and get contents of url php

我尝试将代码合并在一起,以便获得可验证Facebook个人资料或网页链接的内容。我不想获取个人资料信息,图片等,但我的代码也不对,所以不要深入了解我不完全理解的东西,但我认为寻求帮助是最好的。

下面是我混在一起的代码,它给了我错误“警告:preg_match_all()[function.preg-match-all]:编译失败:在第9行偏移29处的无法匹配的括号”

<?php
// get url to check from the page parameter 'url'
// or use default http://example.com
$text = isset($_GET['url']) 
? $_GET['url'] 
: "http://www.vwrx-project.co.uk/user.php?u=borris";

$reg_exurl =             "/(?:http|https|ftp|ftps)?:\/\/)?(?:www\.)?facebook\.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-\.]*)/";
preg_match_all($reg_exurl, $text, $matches);
$usedPatterns = array();
$url = '';
foreach($matches[0] as $pattern){
    if(!array_key_exists($pattern, $usedPatterns)){
        $usedPatterns[$pattern] = true;
        $url = $pattern;
    }
}

?>

----------------------------------------------- ----------附加--------------------------------------- --------------------- 我重新审视了Dave今天为我提供的答案,觉得我可以使用它,从代码的角度来看,这对我来说更有意义,因为我可以遵循这个过程等。

我有一个我非常满意的系统。如果我提供的链接http://www.facebook.com/#!/lilbugga是来自Facebook的典型链接(当您点击墙上的用户名/个人资料照片时),我可以获得显示为有效的结果http://www.facebook.com/lilbugga

它无法处理的是来自facebook的链接,该链接不是虚荣/ seo友好格式,例如https://www.facebook.com/profile.php?id=4。如果我允许我的代码接受?并且=然后我怀疑我将我的网站/数据库打开以进行我不想要的攻击。<​​/ p>

现在最好的选择是什么?这是我的代码

<?php   
$dirty_url = "http://www.facebook.com/profile.php?id=4";  //user supplied link

//clean url leaving alphanumerics : / . only -  required to remove facebook link format with /#!/
$clean_url = preg_replace('#[^a-z0-9:/.]#i', '', $dirty_url); 

$parsed_url = parse_url($clean_url); //parse url to get brakedown of components

$safe_host = $parsed_url['host']; // safe host direct from parse_url

// str_replace to switch any // to a / inside the returned path - required due to preg_replace process above
echo $safe_path = str_replace("//", "/", ($parsed_url['path']));

if ($parsed_url['host'] == 'www.facebook.com') {
  echo "<a href=\"http://$safe_host$safe_path\" alt=\"facebook\" target=\"_new\">Facebook</a>";
} else {
    echo " :( invalid url";
}
?>

2 个答案:

答案 0 :(得分:1)

不确定您要完成的是什么,但听起来您可以使用parse_url

<?php
   $parsed_url = parse_url($_GET['url']);
   //assume it's "http://www.vwrx-project.co.uk/user.php?u=borris"
   print_r($parsed_url);
   /*
     Array
     (
         [scheme] => http
         [host] => www.vwrx-project.co.uk
         [path] => /user.php
         [query] => u=borris
     )
   */
   if ($parsed_url['host'] == 'www.facebook.com') {
      //do stuff
   }
?>

答案 1 :(得分:0)

我从HERE

采用了一些正则表达式模式

获取匹配的组。

(?:http|https|ftp|ftps(?:\/\/)?)?(?:www.|[-;:&=\+\$,\w]+@)([A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??((?:[-\+=&;%@.\w_]*)#?(?:[\w]*)?))

Online demo

输入:

www.example.com/user.php?u=borris
http://www.vwrx-project.co.uk/user.php?u=borris

输出:

MATCH 1
1.  [4-15]  `example.com`
2.  [15-33] `/user.php?u=borris`
3.  [25-33] `u=borris`
MATCH 2
1.  [45-63] `vwrx-project.co.uk`
2.  [63-81] `/user.php?u=borris`
3.  [73-81] `u=borris`