如果找不到更多结果,我怎么能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];
用语言来说,它应该是这样的:
使用此代码,我可以找到 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;
这基本上是做什么(或应该做):
但是这个脚本运行3个卷曲过程:
所以这个循环应该在步骤#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;
但似乎没有用,哈哈。
答案 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];
}
答案 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;
}
}