循环Preg_match直到不再匹配

时间:2015-09-04 16:49:41

标签: php regex loops curl preg-match

如果找不到更多结果,我怎么能preg_match?

我使用curl登录页面,然后从那里删除帖子。

但要删除这些帖子,我需要preg_match内容并过滤ID,如果找到id,我的脚本会运行delete命令。

所以,基本上:

$pattern = '/(?<=list_id=).*?(?=&cmd=edit)/s';
preg_match($pattern, $LoginResult, $id); //THIS PREG_MATCH IS WORKING, IT GETS THE FIRST RESULT OF THE PAGE (WHAT I NEED). BUT I NEED TO MAKE A LOOP TO THIS SCRIPT RUN OVER AND OVER UNTIL NOTHING MORE IS FOUND.
$idpagina = $id[0];

用语言来说,它应该是这样的:

  • 如果&gt; preg_match为真&gt;运行删除命令。
  • 循环如果直到preg_match为假。

使用此代码,我可以找到 list_id = &amp; cmd = edit 之间的所有内容。如果脚本在这两个字符串之间找到了某些内容,则需要执行curl来删除此ID:

//THIS IS WORKING
$paginadelete = "https://example/list/folder/0?list_id=".$idpagina."&cmd=delete&type=AD_DELETE";


    curl_setopt($login, CURLOPT_URL, $paginadelete);
    curl_setopt($login, CURLOPT_POST, 1);
    curl_setopt($login, CURLOPT_FOLLOWLOCATION, 1);
    $step1 = curl_exec($login);
    echo $step1;

这基本上是做什么(或应该做):

  1. 循环preg_match,如果preg_match为true,请转到#2
  2. 运行删除卷曲
  3. 返回#1,直到在preg_match中找不到任何内容
  4. 但是这个脚本运行3个卷曲过程:

    1. 登录
    2. 转到删除页面(上面这个)
    3. 确认删除
    4. 所以这个循环应该在步骤#2和#3之间,直到找不到更多。

      我的#3步骤(确认删除)是这一步:

      $url = curl_getinfo($login, CURLINFO_EFFECTIVE_URL);
      $url = parse_url($url, PHP_URL_PATH);
      $url = substr($url, 9);
      $url = "http://example.com/cmd/act/".$url;
      
      $post_data = array(
      '1' => 'delete',
      '2' => '1',
      '3' => '2',
      '4' => '10',
      '5' => '',
      '6' => 'continue',
      );
      
      //traverse array and prepare data for posting (key1=value1)
      foreach ( $post_data as $key => $value) {
          $post_items[] = $key . '=' . $value;
      }
      
      
      //create the final string to be posted using implode()
      $post_string = implode ('&', $post_items);
      
      
      curl_setopt($login, CURLOPT_URL, $url);
      curl_setopt($login, CURLOPT_POST, 1);
      curl_setopt($login, CURLOPT_FOLLOWLOCATION, 1);
      curl_setopt($login, CURLOPT_POSTFIELDS, $post_string);
      $step2 = curl_exec($login);
      //echo $step2;
      

      //////////////////////编辑

      我在尝试:

      if (preg_match('/(?<=list_id=).*?(?=&cmd=edit)/s', $LoginResult, $id)){
      }
      else {
      }
      

      但这只适用于第一个结果。之后,脚本停止。我需要重新运行if直到preg_match为false,然后在else中结束。

      我考虑过使用DO和WHILE,但我不知道如果它能够工作,也不知道它是什么。

      //////////////////编辑2

      我现在尝试使用GOTO直到获得错误并关闭连接

      verification:
      if (preg_match('/(?<=list_id=).*?(?=&cmd=edit)/s', $LoginResult, $id)){
      [..........]
      } else {
      //close the connection
      curl_close($login);      
      }
      goto verification;  
      

      但似乎没有用,哈哈。

2 个答案:

答案 0 :(得分:1)

你的问题不清楚,但我想你需要的是preg_match_all,即:

    preg_match_all('/((?<=list_id=).*?(?=&cmd=edit))/im', $html, $matches, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($matches[1]); $i++) {

       //here you can implement an if/else to check if the ID exist
        echo $matches[1][$i];
    }

http://php.net/manual/en/function.preg-match-all.php

答案 1 :(得分:0)

根据您的第一次编辑,您尝试实现的目标似乎如下:

while(preg_match('/(?<=list_id=).*?(?=&cmd=edit)/s', $LoginResult, $id)) {
    // do stuff
}
// do stuff after the preg_match is false

修改

根据您对评论的描述,此代码可能会满足您的需求。

while(true) {
    $result = preg_match('/(?<=list_id=).*?(?=&cmd=edit)/s', $LoginResult, $id);
    if($result) {
        // Run Delete Curl
    } else {
        curl_close($login);
        break;
    }
}