PHP简单搜索示例

时间:2014-03-22 06:56:40

标签: php search

我正在学习PHP,并在文本文件脚本中构建了一点搜索。这是一系列事件:

  1. 打开文本文件
  2. 从每个新行创建数组
  3. 如果提交了表单,则将post数据放入函数中运行正则表达式以查找部分字符串或单词,如果匹配,则所有条目将在代码中替换为带有类的CSS。
  4. 我的问题是:

    如果我有一句话:

    汤姆手里拿着相机。我也是地板上的相机。

    搜索" am",搜索并找到相机,用span类替换它。然后它发现" am"并在相机中取代它两次,以及它本身。

    这是我的代码:

        //---- Puts Array into or responds with error
        $lines = file($filename, FILE_IGNORE_NEW_LINES);
        if ( !is_array($lines) ) {
           echo 'Cannot create array from file';
        }
    
        //---- Scans and Displays Lines
        $submission = $_GET['Search'];
        function scanLines($lines, $submission) {
            foreach($lines as $line) {      
                if(strpos($line,$submission)!== false){             
                    preg_match_all("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $line, $matches);  
    
                    $i = 0;
                    foreach($matches[$i] as $match) {   
                        $line = str_replace($match, '<span class="highlight">'.$match.'</span>', $line);
                    $i++;                   
                }
                echo $line;
            }       
        }       
    }
    

    指向示例的直接链接:http://www.effectivemark.com/testphp/

    我的问题是:过滤掉&#34; am&#34;的最佳方法是什么?在相机中,所以它不会添加带有span标签的字符串,如下所示:

        <span class="highlight">c<span class="highlight">am</span>era</span>
    

    更新的代码:

    //---- Scans and Displays Lines
    $submission = $_GET['Search'];
    function scanLines($lines, $submission) {
        foreach($lines as $line) {      
            if(strpos($line,$submission)!== false){ 
    
                $words = explode(' ', $line);
                $i = 0;
                $combine = array();
                foreach($words as $word) {
                    if (preg_match("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $word)) {
                        preg_match_all("/\b[a-z]*".preg_quote($submission)."[a-z]*\b/i", $word, $match);
                        $matches = '<span class="highlight">' . $match[0][0] . '</span>';
                    }
                    else { 
                        $matches = $word;
                    }
                    array_push($combine, $matches);
                $i++;
                }
    
                foreach($combine as $combined) {
                    echo $combined . ' ';
                }
            }       
        }       
    }
    

2 个答案:

答案 0 :(得分:3)

你最好将线条划分为单词,这样可以很容易地将它们匹配

答案 1 :(得分:0)

我认为这样可以:

    <form action="" method="post">
    <h4>Search Object In Text File:</h4>
    <input type="text" name="search" value="">
    <input type="submit" value="Submit" name="Submit">
    </form>
    <?php
        $filename="tekst.txt";
        $lines = file($filename, FILE_IGNORE_NEW_LINES);

        if ( !is_array($lines) ) {
            echo 'Cannot create array from file';
        }

        //---- Scans and Displays Lines

        if(isset($_POST['search']))    
$submission = $_POST['search'];
        scanLines($lines,$submission);

        function scanLines($lines, $submission) {
            foreach($lines as $line) {
                $word_arr=str_word_count($line,1);
                $length=count($word_arr);
                for($i=0;$i<$length;$i++) {

                    if(preg_match("#$submission#",$word_arr[$i],$match)) {
                        $word_arr[$i]='<span class="highlight">'.$word_arr[$i].'</span>';
                        $new_line=implode(' ',$word_arr);
                        echo $new_line.'<br>';
                    }

                }

            }

        }

        ?>

所以,如果你想搜索任何一部分的词,并突出整个词,而不是只匹配部分。对于完整(更严格)的全字搜索,您可以使用简单的in_array()函数。

相关问题