problem with regular expressions in php

2

I'm having a problem with PHP. I created a search system with php without using database. the search works perfectly, the system can search for a word in the files, the problem is in displaying the results of the search, the system used to display the names of the files, but I'm using regular expressions to display the title of the page, if it exists. the code works perfectly only when there are no line breaks after the. However, if I give a simple enter after the code does not work correctly. Here are the codes: Home index.php

<form action="busca.php" method="get">
<input type="text" name="s"><br>
<input type="submit">
</form>

search.php

<?php

//verifica se existe o campo $_POST['pesquisa'] vindo do formulário
$pesq = (isset($_GET['s'])) ? trim($_GET['s']) : '';

        //verifica se o campo está vazio
        if(empty($pesq)){
            echo 'Digite no campo de Busca';
        }else{
            //pasta onde está os arquivos da pesquisa        
            $pasta = "arquivos";
            //arquivo atual
            $atual = "$pasta/busca.php";

            //faz a listagem dos arquivos da pasta indicada, e atribui a um array
            $busca = glob("$pasta/*.{php,html}", GLOB_BRACE);

            //percorre o array
            foreach($busca as $item){
                    //verifica se o arquivo não é o atual
                    if($item !== $atual){
                        //abre o arquivo
                        $abrir = fopen($item, "r");
                        //faz um loop até chegar o final do arquivo
                        while(!feof($abrir)){
                             //ler arquivo
                            $lendo = fgets($abrir);
                            //remove os caracteres html e php
                            $conteudo = $lendo;
                            $lendo = strip_tags($lendo);


                            //verifica se tem algum um item da pesquisa
                            if(stristr($lendo, $pesq) == true){
                                //remove a extensão .php
                                $dados = str_replace(".php", "", $item);
                                //retorna o nome apenas do arquivo
                                $dados = basename($dados);
                                preg_match_all('/<title[^>]*>(.*?)<\/title>/',$conteudo,  $matches, PREG_PATTERN_ORDER);
                                $title = isset($matches[1][0]) ? $matches[1][0] : $dados;
                                //coloca o link no array
                                $result[] = '<a href="?pagina='.$dados.'">'. $title.'</a>';
                                //apaga a variavel $dados
                                unset($dados);
                            }
                            //apague a variavel lendo
                            unset($lendo);
                        }
                        //fecha o arquivo
                        fclose($abrir);    
                    }                
            }

            /*IMPRIMIR O RESULTADO*/

            //verifica seo result existe
            if(isset($result) && count($result) > 0){
                //remove os resultado iguais
                $result = array_unique($result);

                echo '<ul>';

                //percorre o array
                foreach($result as $link){
                    echo "<li>$link</li>";
                }
                echo '<ul>';
            }else{
                echo 'Nenhum resultado na busca';
            }

}
?>
    
asked by anonymous 07.01.2015 / 20:23

2 answers

1

You were looking for the title on the same line as you were looking for your term, which is harder to do, it is better to accumulate the entire file to search for the title, and as Oeslei said, there are missing the flags that point to search for the whole file and with break of line, in case I used the two sm see:

<?php

//verifica se existe o campo $_POST['pesquisa'] vindo do formulário
$pesq = (isset($_GET['s'])) ? trim($_GET['s']) : '';

//verifica se o campo está vazio
if(empty($pesq)){
    echo 'Digite no campo de Busca';
}else{
    //pasta onde está os arquivos da pesquisa        
    $pasta = "arquivos";
    //arquivo atual
    $atual = "$pasta/busca.php";

    //faz a listagem dos arquivos da pasta indicada, e atribui a um array
    $busca = glob("$pasta/*.{php,html}", GLOB_BRACE);

    $lendo = "";
    $conteudo = "";

    //percorre o array
    foreach($busca as $item){
            //verifica se o arquivo não é o atual
            if($item !== $atual){
                //abre o arquivo
                $abrir = fopen($item, "r");
                //faz um loop até chegar o final do arquivo
                while(!feof($abrir)){
                     //ler arquivo
                    $lendo = fgets($abrir);
                    //remove os caracteres html e php
                    $conteudo .= $lendo;
                    $lendo .= strip_tags($lendo);

                }

                //verifica se tem algum um item da pesquisa
                if(stristr($conteudo, $pesq) == true){
                    //remove a extensão .php
                    $dados = str_replace(".php", "", $item);
                    //retorna o nome apenas do arquivo
                    $dados = basename($dados);
                    preg_match_all('/<title[^>]*>(.*?)<\/title>/sm',$conteudo,  $matches);
                    //var_dump($conteudo);
                    //var_dump($matches);
                    $title = isset($matches[1][0]) ? $matches[1][0] : $dados;
                    //coloca o link no array
                    $result[] = '<a href="?pagina='.$dados.'">'. $title.'</a>';
                    //apaga a variavel $dados
                    unset($dados);
                }

                //fecha o arquivo
                fclose($abrir);    
            }                
    }

    /*IMPRIMIR O RESULTADO*/

    //verifica seo result existe
    if(isset($result) && count($result) > 0){
        //remove os resultado iguais
        $result = array_unique($result);

        echo '<ul>';

        //percorre o array
        foreach($result as $link){
            echo "<li>$link</li>";
        }
        echo '<ul>';
    }else{
        echo 'Nenhum resultado na busca';
    }

}

It works, but I recommend reviewing the logic of this code.

    
07.01.2015 / 21:38
1

Try to use the s or m flag. It would look like this: preg_match_all('/expressao/s', ...) .

The s flag is used to consider all characters when using . , including newlines (which are not considered by default).

The m flag is used to consider all the lines in the expression, which by default considers only one line at a time.

link

    
07.01.2015 / 20:57