我有一个 php 脚本可以在我的网络空间文件中搜索。如果我想搜索区分大小写,我可以切换(大小写)。 如果我切换区分大小写它就会起作用。但是,当取消选择此选项时,如果我的单词是大写的,我不会得到任何结果。所以我认为剧本每次都会降低。但即使现在已经过了几个小时,我也找不到问题所在......
PHP 8.3
脚本给了我结果。因此,如果您尝试访问上面链接的德国 Geist (=ghost) 网站,它会给我切换“区分大小写”138 次点击。 但是 关闭后它给我“抱歉没有找到结果。”即使这样结果也一定是159。所以我认为strtolower命令一定有问题?
有什么想法吗?
如果我插入整个脚本,我不
t get an error in the php-sandbox on [PHP Sandbox][1] here
是处理“案例”的脚本部分:
<?php
$count = 0;
function getDirContents($dir, &$results = array()) {
global $count;
$searchStrings = array();
if(isset($_POST['searchStrings']))
$searchStrings = json_decode($_POST['searchStrings'], true);
if ($_POST['search'] == null) { echo "1"; exit;}
ini_set('max_execution_time', $_POST['maxtime']);
$_SESSION['searchString'] = $_POST['search'];
echo "<script>var elm = document.getElementById('search');elm.value='$_POST[search]';</script>";
if (!isset($_POST['case']))
$string = strtolower($_POST['search'] ?? '');
else
$string = $_POST['search'];
$files = scandir($dir);
foreach ($files as $key => $value) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $value);
if (!is_dir($path)) {
if (!isset($_POST['case']))
$content = strtolower(file_get_contents($path));
else
$content = file_get_contents($path);
$label = null;
$fileName = basename($path, '?' . $_SERVER['QUERY_STRING']);
$type = null;
$types = array();...
所以这一定是一个错误,PHP-Sandbox 找不到...
当您想以不区分大小写的方式比较字符串时,您必须将两个字符串转换为小写(或大写)。
if(strtolower($str_a) == strtolower($str_b)){
// match
}
由于您的代码不完整,并且在显示的部分中只有一个字符串转换为小写,我认为您忘记了将另一个字符串转换为小写。
对于简单的搜索也许你可以这样做
$stringInWhichSearching = "Hello world, Geist is here.";
$search = "geist";
$caseSensitiveSearch = false;
if($caseSensitiveSearch === true) {
// strpos is case sensitive
$foundAtIndex = strpos($stringInWhichSearching, $search);
}
else {
// stripos is case insensitive
$foundAtIndex = stripos($stringInWhichSearching, $search);
}
if($foundAtIndex !== false) {
echo "found at index $foundAtIndex" . PHP_EOL;
}
else {
echo "not found" . PHP_EOL;
}
计数处理解决方案
$stringInWhichSearching = "Hello world, Geist is here.";
$search = "geist";
$caseSensitiveSearch = false;
$pattern = preg_quote($search, '/');
if($caseSensitiveSearch === true) {
// the option 'u' is for unicode
$count = preg_match_all("/$pattern/u", $stringInWhichSearching, $matches);
}
else {
// the option 'u' is for unicode, "i" is for case insensitive
$count = preg_match_all("/$pattern/ui", $stringInWhichSearching, $matches);
}
echo "Founded $count times" . PHP_EOL;
警告
这是一个 XSS 安全问题
echo "<script>var elm = document.getElementById('search');elm.value='$_POST[search]';</script>";
如果
$_POST[search]
包含javascript,就有可能做坏事