problem with regular expressions in php

Asked

Viewed 158 times

2

i am having a problem in PHP. I created a search system with php without using database. the search works perfectly, the system can search a word in the files, the problem is in the display of the search results, the system before displayed the name of the files, but I am 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:
index php.

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

php search.

<?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';
            }

}
?>

2 answers

1

Try using the flag s or m. Would that be: preg_match_all('/expressao/s', ...).

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

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

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

1


You were looking for the title in the same line that you were looking for your term, which is harder to do, it’s better to accumulate the entire file to search for the title, and as Oeslei said, the flags that point to the search for the entire file and break the line, in case I used both 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 you review the logic of this code.

  • thanks friend saved me from a cold.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.