2012-05-11 137 views
0

這是一個代碼來捕獲在POST中的所有網址,並將它們短接,然後將它們中的每一個插入mysql中的行.....但是在這裏它將所有的URL插入一行? 所以我怎麼能讓它抓住第一個網址,然後將其插入數據庫然後回去做第二個,並做同樣的..?php插入preg_match_all陣列

$urlinput=mysql_real_escape_string($_POST['url']); 
$pattren="/(http:\/\/)[a-zA-Z0-9]*\.[a-z]*(.*)|(www)\.[a-zA-Z0-9]*\.[com]*(.*)/"; 
preg_match_all($pattren, $urlinput, $matches); 
foreach($matches[0] as $match) { 

$id=rand(10000,99999); 
$shorturl=base_convert($id,20,36); 
$sql = "insert into url values('$id','$match','$shorturl')"; 
mysql_query($sql,$con); 
} 
+0

s/pattren/pattern – ThiefMaster

+0

你的輸入是什麼樣子?什麼是在網址之間?空間?新行? – Gavriel

回答

0

好吧,你的正則表達式中的「(。*)」匹配找到url開頭後的所有內容。所以如果你期望在一個字符串中有多個URL,或者是分開的或者不是的話,它們將被捆綁在一起。

您需要先分割輸入,然後驗證每個元素是否爲有效的網址,然後才能將其插入。

1

這裏http://php.net/manual/en/function.preg-match-all.php您可以閱讀有關preg_match_all的第4個參數。您可以遍歷找到的網址。我改變了你的正則表達式的結束,所以它不會趕上整線:

$urlinput=mysql_real_escape_string($_POST['url']); 
$pattren="/(http:\/\/)[a-zA-Z0-9]*\.[a-z]*(.*)|(www)\.[a-zA-Z0-9]*\.[com]*([a-zA-Z0-9\.\-_\/\?=\:]*)/"; 
preg_match_all($pattren, $urlinput, $matches, PREG_SET_ORDER); 
foreach($matches as $match) { 
    $id=rand(10000,99999); 
    $shorturl=base_convert($id,20,36); 
    $sql = "insert into url values('$id','" . mysql_real_escape_string($match[0]) . "','$shorturl')"; 
    mysql_query($sql,$con); 
} 

而且要小心SQL注入,並且當您在查詢中使用的用戶數據使用mysql_real_escape_string。

+0

您可能想檢查['preg_match_all()'](http://php.net/manual/en/function.preg-match-all.php)的文檔:'$ matches'的元素對應於每個括號子模式(除了'$ matches [0]'這是全模式匹配)。 – eggyal

+0

同樣的問題沒有改變 – maj