在 txt 文件中搜索区分大小写

问题描述 投票:0回答:2

我有一个 php 脚本可以在我的网络空间文件中搜索。如果我想搜索区分大小写,我可以切换(大小写)。 如果我切换区分大小写它就会起作用。但是,当取消选择此选项时,如果我的单词是大写的,我不会得到任何结果。所以我认为剧本每次都会降低。但即使现在已经过了几个小时,我也找不到问题所在......

PHP 8.3

search_all.php 在我的网站空间上

脚本给了我结果。因此,如果您尝试访问上面链接的德国 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 找不到...

php search full-text-search case-sensitive lowercase
2个回答
0
投票

当您想以不区分大小写的方式比较字符串时,您必须将两个字符串转换为小写(或大写)。

if(strtolower($str_a) == strtolower($str_b)){
    // match
}

由于您的代码不完整,并且在显示的部分中只有一个字符串转换为小写,我认为您忘记了将另一个字符串转换为小写。


0
投票

对于简单的搜索也许你可以这样做

$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,就有可能做坏事

© www.soinside.com 2019 - 2024. All rights reserved.