我正在搜索数组中字符串中的网址
某些字符串可能包含多个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存储到表中的一行。
答案 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);