2012-10-24 72 views
-1

这里我们再来一次,我需要一些帮助。 preg_match无法正常工作,因为它不验证任何站点链接。我需要第二双眼睛来帮助我看看我的代码有什么问题。URL缩写,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

你能发布一些例子输入,好吗? –

+0

金字塔代码的命运。 – hakre

回答

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

由于您已经验证了网址,为何不使用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 
} 
+0

这是我尝试的新手,仍然无法工作。 (?:\ /)/(?:[az \ d - ] + \。)* mysite.com(?:(?= \ /)| $)/我',$ url))' – Gromstone

+1

@Gromstone我认真'preg'不应该在这里使用。 –

+0

为什么?我想确保它只适用于来自特定网站的链接。 – Gromstone

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"]**))