PHP检查preg_match是否匹配

时间:2014-04-23 15:03:10

标签: php string preg-match

我正在搜索数组中字符串中的网址

某些字符串可能包含多个URL,而其他字符串可能只包含纯文本

如果字符串包含1个或更多URL,那么我想写一个只在表中存储它们的URL。

否则,如果它只包含文本,我仍然希望将该文本存储在表格中。

这是我到目前为止所尝试的内容。

         $urlList = $urlArrayVal[0]; //String within array
            $regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i'; 
            preg_match_all($regex, $urlList, $matches);
            $urls = $matches[0];
            var_dump($urls);
            // go over all links
            foreach($urls as $url) {
                $sql = "INSERT INTO urls (url) VALUES ('$urls')";
                mysqli_query( $link, $sql);
            }

我现在卡住了。这只会将URL(如果有的话)写入表中,忽略具有纯文本的字符串。

任何帮助都是适用的

编辑:另外,如果一个字符串包含多个URL,我想将该字符串中的所有URL存储到表中的一行。

2 个答案:

答案 0 :(得分:1)

如果我使用这一切都会起作用:

<?php
$urlList = 'something
something and http://www.url.com and so on
and 2 http://www.3url.com or http://www.2url.com in a row';
$regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i'; 
preg_match_all($regex, $urlList, $matches);
$urls = $matches[0];
var_dump($urls);
// go over all links
foreach($urls as $url) {
    echo$sql = "INSERT INTO urls (url) VALUES ('$url')";
    mysqli_query( $link, $sql);
}
?>

你必须给我们一个示例字符串来更好地测试你的问题。

答案 1 :(得分:1)

对每个字符串使用preg_match_all,而不是整个数组:

$sql="INSERT INTO urls (url) VALUES ";
for($i=0; $i<count($urlList), $i++)
{
 $numMatches=preg_match_all($regex, $urlList[$i], $matches, PREG_PATTERN_ORDER);
 if(!$numMatches)
 {
   //handle the error
 }
 else if($numMatches==0)
 {
   //no url's found
   //save $urlList[$i] (the string) somewhere if you want
 }
 else if($numMatches>0)
 {
   //found urls, append them in the query
   for($j=0;$j<count($matches[0]);$j++)
    $sql.=" ('".$matches[0][$j]."'),"
 }
 else
 {
   //this shouldn't happen
 }      
}
rtrim($sql, ",")//remove the last comma from the query
mysqli_query( $link, $sql);