我有点不知所措,但我相信我现在在正确的轨道上。我想采取用户提供的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`