检查字符串是否为单个URL或文本(可能包含URL)的最简单和最快的方法是什么?
可能的情况:
// successful scenario
$example[] = 'http://sub-domain.my-domain.com/folder/file.php?some=param';
// successful scenario
$example[] = '/assets/scripts/jquery.min.js?v=1.4';
// successful scenario
$example[] = 'jquery.min.js';
// this scenario should fail validation
$example[] = "http://www.domain.com welcome text\n and some other http://www.domain.com";
// this scenario should fail validation
$example[] = "scriptVar=50;";我尝试过使用本机php函数,如parse_url、filter_var,但它们都不像预期的那样工作。
更新1
为了更清楚地说明,我试图将可能的URI与作为DOM元素插入的脚本内容分开。所有urls将作为SRC属性,rest作为内容,例如:
<script type="text/javascript" src="{$string}"></script>
<script type="text/javascript">{$string}</script>更新2通过分析可能的内容我得出结论:包含空格字符或分号的字符串意味着字符串不能是URI,我认为这种模式可以解决我的问题:
preg_match('/[\s]|[;]/', $string);它会覆盖所有可能的javascript/css代码吗?
发布于 2010-12-08 19:51:13
如果传递的文本是URL,则此函数将返回true。它是基于在这里看到的一个正则表达式。
function validate_url ($url)
{
  $regex = '/^(https?|ftp):\/\/'; //protocol
  $regex .= '(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+'; //username
  $regex .= '(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?'; //password
  $regex .= '@)?'; //auth requires @
  $regex .= '((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'; //domain segments AND
  $regex .= '[a-z][a-z0-9-]*[a-z0-9]'; //top level domain  OR
  $regex .= '|((\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])\.){3}';
  $regex .= '(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])'; //IP address
  $regex .= ')(:\d+)?'; //port
  $regex .= ')(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'; //path
  $regex .= '(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'; //query string
  $regex .= '?)?)?'; //path and query string optional
  $regex .= '(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'; //fragment
  $regex .= '$/i';
  return (preg_match($regex, $url) ? true : false);
}你可以在这里试试:http://www.exorithm.com/algorithm/view/validate_url
编辑响应评论,此函数将验证/index.php或index.php之类的URL片段
function validate_url_fragment ($url)
{
  $regex = '/^(((\/?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*'; //path
  $regex .= '(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)'; //query string
  $regex .= '?)?)?'; //path and query string optional
  $regex .= '(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?'; //fragment
  $regex .= '$/i';
  return (preg_match($regex, $url) ? true : false);
}
if (validate_url_fragment($url) || validate_url($url)) {
  //is url
} else {
  //not url
}(请注意,空字符串是有效的,因此您可能需要一个特例)
https://stackoverflow.com/questions/4390534
复制相似问题