【问题标题】:Need help grabbing the number after a specific word in a long string需要帮助抓取长字符串中特定单词后的数字
【发布时间】:2013-09-06 19:44:58
【问题描述】:

我收到了这个长字符串,我使用 CURL 从表单帖子中获取数据。在这个长字符串中,我需要找到“错误”这个词,然后抓住它后面的任何数字。因此,如果在搜索过程中发现“错误 2”,我需要抓取 2 并显示它。我的问题是,当我尝试将其打印出来时,我得到 NULL 和一个空数组。我的代码如下。

$Rec_Data = curl_exec($ch);

ob_start();
 header("Content-Type: text/html");
$Temp_Output = $Rec_Data;

if(strpos($Temp_Output,"Error")>=0){

   preg_match("/Error (\d+)/", $Temp_Output, $error);
   var_dump ($error[1]); //prints NULL for $error[0] and $error[1] and when printing $error it is an empty array.

}    

这是我的 CURL 代码

$PostVars = "lname=" . $lname . "&fname=". $fname . "&uid=" . $uid . "&rsp=" . $rsp . "&z1=" . $z1 . "&module=" . $module . "&CFID=" . $CFID . "&CFTOKEN=" . $CFTOKEN;
 $ch = curl_init(POSTURL);
 curl_setopt($ch, CURLOPT_POST      ,1);
 curl_setopt($ch, CURLOPT_POSTFIELDS    , $PostVars);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
 curl_setopt($ch, CURLOPT_HEADER      ,0);  // DO NOT RETURN HTTP HEADERS
 curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);  // RETURN THE CONTENTS OF THE CALL
 $Rec_Data = curl_exec($ch);

 var_dump ($Rec_Data);
 ob_start();
 header("Content-Type: text/html");
 $Temp_Output = $Rec_Data;

【问题讨论】:

  • 你能显示使用Rec_Data 输出吗?
  • 这将有助于查看您使用 CURL 收到的字符串是什么...这样,我们可以更好地了解您当前的正则表达式可能有什么问题
  • 另外,你应该编辑your previous question而不是发布另一个。
  • 也许我没有做错 CURL,因为 Rec_Data 的输出给了我 bool(false)。但是必须有某种类型的字符串,其中包含单词“Error”,因为使用 strpos 的 if 语句返回 true。
  • 那直接打印$Rec_Data怎么样?也许尝试preg_match("/Error.*/", $Temp_Output, $error); 并打印$error[0]

标签: php regex curl


【解决方案1】:

documentation pagestrpos 在没有找到任何东西时返回false

尝试在您的 IF 中使用它:

if(strpos($Temp_Output,"Error") !== false ) {
    // Do other things
}

因为false >= 0 在 PHP 中的计算结果很好......你总是会进入 IF 无论如何。

免责声明:在发布此答案之前,我不知道 strpos 是如何工作的。

【讨论】:

  • 是的,似乎需要对 'false' 进行测试,即 !== false。去图,一个返回值的双重测试。 0 = 位置和假,哈哈哈...
  • 我想最大的问题是,0 == false 吗?那么 !strpos() 或者 value != strpos()... 等等,除非它是 'false'
【解决方案2】:

也许“错误”不在页面上。 试试

 Error\s*(\d*)

如果你有字符串插值试试

 "/Error\\s*(\\d*)/"

不是php用户,但是如果单引号,试试

 '/Error\s*(\d*)/'

如果它像 Perl,分隔符就是引号

 /Error\s*(\d*)/

【讨论】:

  • 这些似乎都不起作用。当程序进入 if 语句时,错误必须在页面某处 if(strpos($Temp_Output,"Error")>=0)
  • 尝试使用preg_match('/(?<=Error)\s+(\d+)/', $Temp_Output, $error); var_dump($error); 或开始调试您的脚本。
  • @Jake Funchion - 这很奇怪,我使用 \s*\d* 的原因意味着它本身就匹配“错误”。因此,就正则表达式而言,“错误”并不真正存在。尝试不区分大小写,(?i)error\s*(\d*) - 我不知道 php。
猜你喜欢
  • 1970-01-01
  • 2019-08-16
  • 2021-10-28
  • 2020-12-03
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多