2012-10-24 71 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"]**))