从txt文件中提取字符串并以curl数组形式发送

qcbq4gxm  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(104)

我正在编写一些代码,这些代码在文本文件中搜索特定的字符串,然后返回该行中的其余字符。
例如,在文本文件中将...
2011年4月字符串1和字符串2
我希望代码搜索“string 1”,识别“&”,并返回后面的所有内容,即“string 2”。然后需要在一个curl数组中发送。
这就是我到目前为止所拥有的...在其他问题的帮助下...

$eventid = "string1";

$count = 1;
$handle = fopen("https://www.example.com/output.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $pos = strpos($line, $eventid);
            if ($pos !== false) {
                $text= substr($line, strpos($line, "&") + 1);
                echo $text;
                break;
            }
        $count++; 
    }

    fclose($handle);
} else {
    // error opening the file.
}

这似乎是我想要的,并在$text中返回“string 2”。但是当我将$text输入到curl数组中并执行时,我在响应中得到一个错误,说“JSON格式无效”。
下面是curl代码的一个片段。

CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{ "string": "'.$text.'"}',

我会很感激你的帮助谢谢
编辑:
因此,当我最初将这两个字符串存储在txt文件中时,在命令的末尾有一个PHP_EOL命令,这样下一个条目将在新的一行中。我认为该命令在string 2的末尾添加了一个隐藏的值,当我将其输入到curl数组中时,它不喜欢它。所以我改变了在文本文件中存储字符串的方式,在命令的开头加上PHP_EOL,后面跟着字符串。curl不再有错误。
编辑2:以下是误解的评论...
这就是output.txt文件的生成方式。

$filename = 'output.txt';
$date = date("d/m-H:i : ");
$eventid = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'),1,16);
file_put_contents($filename, array(PHP_EOL, $date, 'eventid=', $eventid, '&', $string), FILE_APPEND);

以下是内容的示例...

05/11-03:40 : afgwhdkp4srzvbtc&E.C.P.CssBOR39QXh2Q3Vd8AETrNGSMgczh17L88msrC6FsmykSZFR7XzxbIpFnPuAQdBPbdmShKa6b3bhbSo4gqECUW5W5Y6OoPLQlRA-uvxMTkRblKK4Yb0TM66DHChJALsAQ0fDWeqSKB7XrehW3D52GXtjXxQuWhp5KpKQuf1m3JhI7gp5Rl_t7BabNNMeHLR9ecVJ7lHwZxEoyv9xIzJgXw0-Vi4KCWtwH0JDxxVrlxynyEu830fub4R3gy94wvkm2YLKdPSmsil3NVzUuD4SBHYyLjAaIJYLgslxEyzjLZlf7J4vcu-1zJguCrQp0Iq7JZ_qmRZT
05/11-06:10 : mnztrselg9iv0xao&E.C.P.CssBQ1X9Uz4m6lkvYSQgd4wK95nmwl44LjQ8IhDzthInNbQzSaWsRmB-A-ieyYuixUnEnanc3HMGDyKKHUZi3gf-QAjXk4XtBxgrXB46bOWQ3iPnXjFX4Z2MjB8isA5ID6IcmsCXIay34d74yV72N5Z6LOzXCxJH2vRhpyJfywUiO9Amg-HiieL7oQwVm3igFFE3uVV75qw8GQgueyKHqaiiOlPmYvNAnIL2McGMq_pTYVJC-aPj8jyPw8DdRDzmQpJOthysPqz5rr9ZYd0SBHYyLjAaIO_BO5uaIHfqvWXxDLkK_Alxn6o33Ck-SSquyGuMczwg

格式为“日期-时间:eventid&string”每个条目都有一个新行。但是我还没有指定代码要查找的“/n”。
'误解' -在您下面的代码中,$str返回string 1,然后返回文件的其余内容。我假设是因为我没有在output.txt中的每一行都以“/n”结尾。

vfhzx4xs

vfhzx4xs1#

更新

格式为“日期-时间:eventid&string”每个条目都有一个新行。但是我还没有指定代码要查找的“/n”。
在我的Linux服务器上,PHP_EOL\n
有时当我为Windows生成一个文件时,我用"\r\n"终止一行。
我从不使用PHP_EOL
您可以将\n替换为PHP_EOL
我生成了一个如下所示的测试event.txt(以\n结尾的行):

$filename = 'event.txt';
$date = date('m/d H:i : ',time());
$eventid = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'),1,16);
$string = str_shuffle('abcdef');
file_put_contents($filename, array( $date, 'eventid=', $eventid, '&', "$string\n" ), FILE_APPEND);

我的测试文件(event.txt):

11/08 17:21 : eventid=ug0m8kjw7ntrzs3x&fadbce
11/08 17:21 : eventid=fe6xthnjlmk1ag3y&cdaebf
11/08 17:21 : eventid=6a7sclhg4jd0w9oq&fcebad
11/08 17:21 : eventid=jrfd4ptcq2z1wvoa&ebdafc

在生成JSON字符串时,我从一个数组开始,并将其转换为json_encode()
我的代码:

$data = explode("\n",file_get_contents("event.txt"));
foreach($data as $line){
  $pos = strpos($line,'&') + 1;
  $array = array('string',substr($line,$pos));
  $jsn = json_encode($array,JSON_FORCE_OBJECT);
  echo "$jsn\n";
}

输出量:

{"string":"fadbce"}
{"string":"cdaebf"}
{"string":"fcebad"}
{"string":"ebdafc"}
{"string":false}

我在文件中添加了一个trim(),并删除了[“string”,false]:

$data = explode("\n",trim(file_get_contents("event.txt")));

我还用PHP_EOL替换了\n,得到了相同的结果。

$data = explode(PHP_EOL,file_get_contents("events.txt"));

更新结束
您的代码(或我)可能做出了一些不正确的假设。
每个参数后面是否有新行?
你的代码是这么认为的。
如果你能发布一个output.txt的例子或片段,那将是一个很大的帮助。
让我们试试这个:

$data = file_get_contents("https://www.example.com/output.txt");
$start = strpos($data,$eventid);  // find position of event id
$end = strpos($data,'&',$start);  / find the position of the first '&' following  event id
$query = substr($data,$start,$end-$start);  // grab query parameter 1

请注意,第一个strpos()没有第三个参数。
其中第二个($end=)有第三个参数。
如果你有任何问题,尽管问,因为我不知道你的专业水平。
现在我需要知道我们正在解析的这个查询字符串后面是什么。假设它是一个查询字符串。
了解字符串被解析后的内容非常重要。
我可能更容易提取整个查询字符串并在“&”上展开它。
如果查询字符串以换行符终止:

$data = file_get_contents("https://www.example.com/output.txt");
$start = strpos($data,$eventid);  // find position of event id
$end = strpos($data,"\n",$start);  / find the position of the first '&' following  event id
$str= substr($data,$start,$end-$start);  // grab whole query string
$parameters = explode('&',$str);

$json = json_encode($paramters);
CURLOPT_POSTFIELDS => $json;

若要解决当前错误,请添加此选项:

curl_setopt($ch, CURLINFO_HEADER_OUT, true);

然后curl_exec()之后......

$response = curl_exec($ch);
echo "\nheader out:\n" . curl_getinfo($ch,CURLINFO_HEADER_OUT);
exit;

相关问题