Php 循环预匹配,直到不再匹配

Php 循环预匹配,直到不再匹配,php,regex,loops,curl,preg-match,Php,Regex,Loops,Curl,Preg Match,在没有更多结果之前,我如何进行预匹配 我使用curl登录一个页面,然后从那里删除帖子 但是要删除这些帖子,我需要预先匹配内容并过滤ID,如果在那里找到ID,我的脚本将运行delete命令 因此,基本上: $pattern = '/(?<=list_id=).*?(?=&cmd=edit)/s'; preg_match($pattern, $LoginResult, $id); //THIS PREG_MATCH IS WORKING, IT GETS THE FIRST RESUL

在没有更多结果之前,我如何进行预匹配

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

但是要删除这些帖子,我需要预先匹配内容并过滤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];
这基本上是(或应该是):

  • 循环preg_匹配,如果preg_匹配为真,则转到#2
  • 运行删除卷曲
  • 返回到#1,直到在preg#u match中找不到任何内容
  • 但此脚本运行3个curl进程:

  • 登录
  • 转到删除页面(上面的这一页)
  • 确认删除
  • 所以这个循环应该在第2步和第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\u match(')/(?你的问题不清楚,但我想你需要的是
    preg\u match\u 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];
        }
    

    preg_match_all('/(?基于您的第一次编辑,您似乎正在尝试实现以下目标:

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

    while(预匹配/(?为什么您要使用正则表达式来解析查询字符串参数?为什么不使用内置的php函数来执行您喜欢的操作,或者甚至只访问
    $\u GET
    变量?您是否尝试过使用?@iam解码器,因为此URL位于输入中,而不是标头中。@Pedropinhero是的……但我认为这不是一个好主意,因为他的帖子页面将有很多页面…我更喜欢每次检查页面中是否存在ID。为什么不希望同时删除所有帖子?额外加载和花费在操作上的时间有什么好处?我将测试这一个…我只是在控制面板中添加新帖子,并尝试删除。尽快我在这里给出反馈:D Tha嗯……脚本一直在运行,只删除第一个结果。是的……页面一直在运行……在
    //do stuff
    部分中,您需要指定一些条件来中断循环或更改
    $LoginResult
    可能使用Sorry for The later response。在“//do stuff after The preg\u match is false”中,我关闭了curl c连接“curl_close($login);”即使它不起作用……有什么想法吗?@Diego,我更新了答案,看看这是否对你有帮助。我认为Pedro Pinheiro的答案更符合我的需要。在这种情况下,Preg_match_一切都不会起作用。
        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];
        }
    
    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;
        }
    }