【问题标题】:preg_match_all find links, remove same results? [duplicate]preg_match_all 查找链接,删除相同的结果? [复制]
【发布时间】:2016-02-09 07:29:27
【问题描述】:

我的匹配结果有问题,这是我的脚本,找不到如何从抓取的内容中添加链接并避免相同的结果??我只需要以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,谢谢你的帮助!!!对不起我的英语不好......

【问题讨论】:

  • 然后将您的http:\/\/www.adress.com 前缀添加到捕获组。
  • 问题是我不知道如何编辑这个正则表达式

标签: php regex preg-match-all


【解决方案1】:

您可以使用以下代码:

// 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].'">

注意:您的代码应该以&lt;?php 开头,而不仅仅是&lt;?

【讨论】:

  • 你现在可以检查我的代码吗?我已经更新了...
  • 我在回答中添加了您需要对代码执行的操作以避免重复的超链接以及如何输出它们。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 2019-09-27
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多