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


URL Validation/Sanitization with Regular Expressions

我有点不知所措,但我相信我现在在正确的轨道上。我想采取用户提供的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和另一个堆栈溢出post检查字符串是否包含url并获取url php的内容。

我试图合并代码在一起,使我得到的东西,将验证一个facebook个人资料或页面的链接。我不想得到个人资料信息,图片等,但我的代码也不对,所以,而不是深入到我不完全理解的东西,我认为寻求帮助是最好的。

下面是我拼凑在一起的代码,它给了我错误"警告:preg_match_all()[函数。preg-match-all]:编译失败:偏移量29的括号不匹配…第9行

<?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。如果我允许我的代码接受?和=然后我怀疑我离开我的网站/数据库开放攻击,我不想。

现在最好的选择是什么?这是我的代码
<?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";
}
?>

不确定您到底想要完成什么,但听起来您可以使用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
   }
?>

我从这里取了一些正则表达式模式

获取匹配的组。

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

在线演示输入:

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`