PHP、cURL、strpos - 逐行比较文本文件中的子字符串与变量中的字符串
PHP, cURL, strpos - Compare substring from text file line by line with string from variable
我使用 cURL 从数据库中获取数据并将其保存在变量 ($alter) 中。
接下来,读取一个文本文件。这是通过循环一定次数来完成的。从而从文本文件中读取一行并将其写入变量“$linex”。然后应该将变量“$linex”与变量“$alter”进行比较。然后与第二行进行比较,依此类推。
但不幸的是,它并没有像描述的那样工作。 "false" 始终为每一行输出,即使字符串必须匹配。
代码哪里出错了?
<?php
header('Content-type: text/html; charset=utf-8');
$User_Agent = 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0';
$id = $_POST["id"];
$id2 = $_POST["klass"];
$id3 = $_POST["element"];
$url2 = "https://bpk.bs.picturemaxx.com/api/v1/editing/classifications/$id2/elements";
$request_headers = [];
$request_headers[] = 'Accept: application/json';
$request_headers[] = 'charset=utf-8';
$request_headers[] = 'Content-Type: application/json; charset=utf-8';
$request_headers[] = 'Accept-Encoding: gzip, deflate, identity';
$request_headers[] = 'Accept-Language: de,en-US;q=0.7,en;q=0.3';
$request_headers[] = 'X-picturemaxx-api-key: key';
$request_headers[] = 'Authorization: Bearer key';
$ch = curl_init($url2);
curl_setopt($ch, CURLOPT_USERAGENT, $User_Agent);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
$result = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($result, true);
$alternativnameze = array();
foreach($data['items'] as $alternativ) {
$alternativname = $alternativ['localized'];
$alternativnamez = $alternativname['de-de'];
$alternativnameze[] = $alternativnamez['classification_element_name'];
}
$alter = substr(implode($alternativnameze),0 ,1000000);
$file = 'name_test.txt';
$fh = fopen($file, 'r');
if ($fh === false) {
die('Could not open file: '.$file);
}
for ($i = 0; $i < 6; $i++) {
$linex = fgets($fh);
if (strpos($alter, $linex) !== false) {
echo 'true<br />';
} else {
echo 'false<br />';
}
}
if (fclose($fh) === false) {
die('Could not close file: '.$file);
}
?>
变量“$alter”的输出示例
C. S. Lewis, [29.11.1898 - 22.11.1963], (Clive Staples-Lewis ; Clive
Staples Lewis ; C. S. Luis ; C. Hamilton ; C. S. Ruisu ; Klajv S.
Lʹjuis ; Klaĭv S. Lʹi︠u︡is ; Clive S. Lewis ; Clive Staples Lewis ;
Jack Lewis ; C.S. Luis ; N.W. Clerk ; C.S. Lewis)
变量“$linex”的输出示例,应将其作为子字符串与整个字符串“$alter”进行比较
C. S. Lewis, [29.11.1898 - 22.11.1963]
非常感谢所有提示和解决方案建议。
fgets
return 文件 中的一行,新行字符 。因此,如果文本文件中的一行只是 a
,fgets($fh);
将 return a\n
(在 Linux 中,其他 OS 中的字符不同). strpos("a b c", "a\n")
将始终 return 为假。
一个 trim
应该可以解决问题:
$linex = trim(fgets($fh));
尝试 $linex = rtrim($linex, "\r\n");
在比较之前处理文件中可能出现的额外行结束字符。
我使用 cURL 从数据库中获取数据并将其保存在变量 ($alter) 中。
接下来,读取一个文本文件。这是通过循环一定次数来完成的。从而从文本文件中读取一行并将其写入变量“$linex”。然后应该将变量“$linex”与变量“$alter”进行比较。然后与第二行进行比较,依此类推。
但不幸的是,它并没有像描述的那样工作。 "false" 始终为每一行输出,即使字符串必须匹配。
代码哪里出错了?
<?php
header('Content-type: text/html; charset=utf-8');
$User_Agent = 'Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0';
$id = $_POST["id"];
$id2 = $_POST["klass"];
$id3 = $_POST["element"];
$url2 = "https://bpk.bs.picturemaxx.com/api/v1/editing/classifications/$id2/elements";
$request_headers = [];
$request_headers[] = 'Accept: application/json';
$request_headers[] = 'charset=utf-8';
$request_headers[] = 'Content-Type: application/json; charset=utf-8';
$request_headers[] = 'Accept-Encoding: gzip, deflate, identity';
$request_headers[] = 'Accept-Language: de,en-US;q=0.7,en;q=0.3';
$request_headers[] = 'X-picturemaxx-api-key: key';
$request_headers[] = 'Authorization: Bearer key';
$ch = curl_init($url2);
curl_setopt($ch, CURLOPT_USERAGENT, $User_Agent);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
$result = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($result, true);
$alternativnameze = array();
foreach($data['items'] as $alternativ) {
$alternativname = $alternativ['localized'];
$alternativnamez = $alternativname['de-de'];
$alternativnameze[] = $alternativnamez['classification_element_name'];
}
$alter = substr(implode($alternativnameze),0 ,1000000);
$file = 'name_test.txt';
$fh = fopen($file, 'r');
if ($fh === false) {
die('Could not open file: '.$file);
}
for ($i = 0; $i < 6; $i++) {
$linex = fgets($fh);
if (strpos($alter, $linex) !== false) {
echo 'true<br />';
} else {
echo 'false<br />';
}
}
if (fclose($fh) === false) {
die('Could not close file: '.$file);
}
?>
变量“$alter”的输出示例
C. S. Lewis, [29.11.1898 - 22.11.1963], (Clive Staples-Lewis ; Clive Staples Lewis ; C. S. Luis ; C. Hamilton ; C. S. Ruisu ; Klajv S. Lʹjuis ; Klaĭv S. Lʹi︠u︡is ; Clive S. Lewis ; Clive Staples Lewis ; Jack Lewis ; C.S. Luis ; N.W. Clerk ; C.S. Lewis)
变量“$linex”的输出示例,应将其作为子字符串与整个字符串“$alter”进行比较
C. S. Lewis, [29.11.1898 - 22.11.1963]
非常感谢所有提示和解决方案建议。
fgets
return 文件 中的一行,新行字符 。因此,如果文本文件中的一行只是 a
,fgets($fh);
将 return a\n
(在 Linux 中,其他 OS 中的字符不同). strpos("a b c", "a\n")
将始终 return 为假。
一个 trim
应该可以解决问题:
$linex = trim(fgets($fh));
尝试 $linex = rtrim($linex, "\r\n");
在比较之前处理文件中可能出现的额外行结束字符。