我们再来一次,我需要一些帮助。 preg_match没有按我的意愿工作,它没有验证任何站点链接。我需要第二双眼睛来帮助我看清我的代码有什么问题。
if (!empty($_POST["url"]))
{
if (filter_var($_POST["url"], FILTER_VALIDATE_URL))
{
if (!preg_match('/^http(s)?:\/\/(?:[a-z\d-]+\.)*mysite.com(?:(?=\/)|$)/i', $url))
{
echo "<strong>Error</strong>: Not a valid Mysite.com link or could shorten link";
} else {
$result = $sql->query("SELECT `id` FROM `shortcuts` WHERE `url`='{$_POST["url"]}'");
$id = $result[0]["id"];
if (empty($id))
{
$result = $sql->query("INSERT INTO `shortcuts` (`url`) VALUES ('{$_POST["url"]}')");
if ($result)
{
$id = $sql->get_increment();
if (empty($id))
{
echo "FAILED ENCODE";
exit(1);
}
}
$shorturl = "http://mysite.com/".encode($id);
}
}
}
}
答案 0 :(得分:2)
由于您已经验证了网址,为什么不在其上使用parse_url()
来提取主机名?
if (false === stristr(parse_url($_POST['url'], PHP_URL_HOST), 'mysite.com')) {
// not valid url
}
或者,如果'mysite.com`必须是主机名的最后一位:
if (0 !== substr_compare(parse_url($_POST['url'], PHP_URL_HOST), 'mysite.com', -10, 10, true)) {
// invalid url
}
答案 1 :(得分:0)
让自己的代码更简单,因此更容易调试。如果我理解你,你会担心这里的具体问题:
if (matches_shorturl_pattern($url) {
// go on ...
}
创建一个功能。好的方面是,你可以测试它而不需要提交或点击数据库。
/**
* is URL a valid shorturl by syntax?
*
* @param string $url
* @return bool
*/
function matches_shorturl_pattern($url) {
$pattern = '/^http(s)?:\/\/(?:[a-z\d-]+\.)*mysite.com(?:(?=\/)|$)/i';
$result = preg_match($pattern, $url);
if ($result === FALSE) {
throw new Exception('The regex did a poop.');
}
return (bool) $result;
}
使用您想要再次测试的输入单独测试此功能要容易得多。此外,您还要正确检查错误情况。祝你好运。
答案 2 :(得分:0)
我找到了它!,
if (!preg_match('/^http(s)?:\/\/(?:[a-z\d-]+\.)*mysite.com(?:(?=\/)|$)/i', **$url**))
新
if (!preg_match('/^http(s)?:\/\/(?:[a-z\d-]+\.)*mysite.com(?:(?=\/)|$)/i', **$_POST["url"]**))