preg_match_all 查找链接,删除相同的结果?
preg_match_all find links, remove same results?
我的匹配结果有问题,这是我的脚本,找不到如何从抓取的内容中添加 link 并避免相同的结果??我只需要以 http://www.autogidas.lt/ ....
开头的结果
<?
$id= $_GET['id'];
$user= $_GET['user'];
$login=$_COOKIE['login'];
$query = mysql_query("SELECT pavadinimas,nuoroda,kuras,data,data_new from autogidas where vartotojas='$user' and id='$id'");
$rezultatas=mysql_fetch_row($query);
$url = "$rezultatas[1]";
$info = file_get_contents($url);
function scrape_between($data, $start, $end){
$data = stristr($data, $start);
$data = substr($data, strlen($start));
$stop = stripos($data, $end);
$data = substr($data, 0, $stop);
return str_replace(' ', ' ', $data);
}
$contents = scrape_between($info, "<table border=\"0\" cellspacing=\"0\">", "</table>");
preg_match_all('/<span class="ttitle2".*?>(.*?)<\/span>/',$contents,$pavadinimas);
preg_match_all('/<span class="ttitle3".*?>(.*?)<\/span>/',$contents,$miestas);
preg_match_all('/<span class="ttitle1".*?>(.*?)<\/span>/',$contents,$metai_kaina);
foreach($metai_kaina[0] as $key=>$metai_kaina_val){
if($key%2==0)
$metai[] = strip_tags($metai_kaina_val);
else
$kaina[] = strip_tags($metai_kaina_val);
}
preg_match_all('/<img .*?(?=src)src=\"([^\"]+)\"/si', $contents, $img_link);
preg_match_all('/<a href="http:\/\/www.autogidas.lt(.*?)"/s', $contents, $matches);
for($i=0; $i<count($pavadinimas[0]); $i++){
echo '<tr>
<td><a href='HERE I NEED LINKS'><img src="'.$img_link[1][$i].'"></a></td>
<td>'.$pavadinimas[0][$i].'</td>
<td>'.$miestas[0][$i].'</td>
<td>'.$metai[$i].'</td>
<td><center>'.$kaina[$i].'</center></td>
</tr>';
}
echo "</table>";
?>
我尝试了一些帮助,但不知道如何更新脚本,这是我需要的最后一件事,但找不到如何做...我不是专业人士,我只是为了好玩而学习自己 php,感谢帮助!!!抱歉我的英语不好....
您可以使用此代码:
// RegEx to only match with http://www.address.com/* kind of URLs in anchors
$regexp = "<a\s[^>]*href=(\"??)(http\:\/\/www\.adress\.com\/[^\" >]*?)\1[^>]*>(.*)<\/a>";
if (preg_match_all("/$regexp/siU", $svetaines_turinys, $matches, PREG_SET_ORDER)) {
// collect results in array
$arr = [];
foreach($matches as $match) {
$arr[] = $match[2];
}
// remove duplicates from it
$arr = array_unique($arr);
// send to client
foreach($arr as $match) {
echo "$match <BR/>";
}
}
在对原始问题进行更改后进行编辑:
您想要获得唯一的超链接,因为在您抓取的页面上使用了两次相同的超链接。但是两者的出现方式并不完全相同,只有两者之一后跟一个 img
标记,因此您可以更改获取 $matches
的正则表达式,如下所示:
preg_match_all('/<a href="(http:\/\/www.autogidas.lt[^"]*)"\s*>\s*<img/s',
$contents, $matches);
请注意,在上面的正则表达式中,我还移动了左括号以匹配整个 url
,这正是您在下面的代码中所需要的。
然后在你的循环中,你可以在你引用的字符串中输出这个片段的超链接:
<a href="'.$matches[1][$i].'">
注意:您的代码应该以 <?php
开始,而不仅仅是 <?
我的匹配结果有问题,这是我的脚本,找不到如何从抓取的内容中添加 link 并避免相同的结果??我只需要以 http://www.autogidas.lt/ ....
开头的结果 <?
$id= $_GET['id'];
$user= $_GET['user'];
$login=$_COOKIE['login'];
$query = mysql_query("SELECT pavadinimas,nuoroda,kuras,data,data_new from autogidas where vartotojas='$user' and id='$id'");
$rezultatas=mysql_fetch_row($query);
$url = "$rezultatas[1]";
$info = file_get_contents($url);
function scrape_between($data, $start, $end){
$data = stristr($data, $start);
$data = substr($data, strlen($start));
$stop = stripos($data, $end);
$data = substr($data, 0, $stop);
return str_replace(' ', ' ', $data);
}
$contents = scrape_between($info, "<table border=\"0\" cellspacing=\"0\">", "</table>");
preg_match_all('/<span class="ttitle2".*?>(.*?)<\/span>/',$contents,$pavadinimas);
preg_match_all('/<span class="ttitle3".*?>(.*?)<\/span>/',$contents,$miestas);
preg_match_all('/<span class="ttitle1".*?>(.*?)<\/span>/',$contents,$metai_kaina);
foreach($metai_kaina[0] as $key=>$metai_kaina_val){
if($key%2==0)
$metai[] = strip_tags($metai_kaina_val);
else
$kaina[] = strip_tags($metai_kaina_val);
}
preg_match_all('/<img .*?(?=src)src=\"([^\"]+)\"/si', $contents, $img_link);
preg_match_all('/<a href="http:\/\/www.autogidas.lt(.*?)"/s', $contents, $matches);
for($i=0; $i<count($pavadinimas[0]); $i++){
echo '<tr>
<td><a href='HERE I NEED LINKS'><img src="'.$img_link[1][$i].'"></a></td>
<td>'.$pavadinimas[0][$i].'</td>
<td>'.$miestas[0][$i].'</td>
<td>'.$metai[$i].'</td>
<td><center>'.$kaina[$i].'</center></td>
</tr>';
}
echo "</table>";
?>
我尝试了一些帮助,但不知道如何更新脚本,这是我需要的最后一件事,但找不到如何做...我不是专业人士,我只是为了好玩而学习自己 php,感谢帮助!!!抱歉我的英语不好....
您可以使用此代码:
// RegEx to only match with http://www.address.com/* kind of URLs in anchors
$regexp = "<a\s[^>]*href=(\"??)(http\:\/\/www\.adress\.com\/[^\" >]*?)\1[^>]*>(.*)<\/a>";
if (preg_match_all("/$regexp/siU", $svetaines_turinys, $matches, PREG_SET_ORDER)) {
// collect results in array
$arr = [];
foreach($matches as $match) {
$arr[] = $match[2];
}
// remove duplicates from it
$arr = array_unique($arr);
// send to client
foreach($arr as $match) {
echo "$match <BR/>";
}
}
在对原始问题进行更改后进行编辑:
您想要获得唯一的超链接,因为在您抓取的页面上使用了两次相同的超链接。但是两者的出现方式并不完全相同,只有两者之一后跟一个 img
标记,因此您可以更改获取 $matches
的正则表达式,如下所示:
preg_match_all('/<a href="(http:\/\/www.autogidas.lt[^"]*)"\s*>\s*<img/s',
$contents, $matches);
请注意,在上面的正则表达式中,我还移动了左括号以匹配整个 url
,这正是您在下面的代码中所需要的。
然后在你的循环中,你可以在你引用的字符串中输出这个片段的超链接:
<a href="'.$matches[1][$i].'">
注意:您的代码应该以 <?php
开始,而不仅仅是 <?