Skip to content

Instantly share code, notes, and snippets.

@josecarlosqs
Created May 10, 2017 07:59
Show Gist options
  • Save josecarlosqs/fb2752ec25e9d2ee958601b7910dfadb to your computer and use it in GitHub Desktop.
Save josecarlosqs/fb2752ec25e9d2ee958601b7910dfadb to your computer and use it in GitHub Desktop.

Revisions

  1. josecarlosqs created this gist May 10, 2017.
    119 changes: 119 additions & 0 deletions comparador.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,119 @@
    <!DOCTYPE html>
    <html>
    <head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <meta charset="UTF-8">
    </head>
    <body>
    <div class="container" style="margin-top: 20px;">
    <div class="row">
    <?php
    if($_POST){

    // Funcion que quita caracteres especiales
    function filterSpecialChars($str){
    return preg_replace("/[^a-z0-9]/i", "", $str);
    }

    // Funcion que busca el elemento(needle) mas parecido dentro de un array(haystack), determinando un minimo de 90%
    function searchSimilarItem($needle,$haystack){
    $length = count($haystack);
    $similarity = 0;
    for($d = 0; $d < $length; $d++){
    if($haystack[$d] !== ""){
    similar_text($needle,$haystack[$d],$similarity);
    if($similarity >= 90){
    return $d;
    }
    $similarity = 0;
    }
    }
    return -1;
    }

    // Funcion que extrae una parte de una oracion basada en un array
    function getMarkedSection($arr,$mark_index){
    $arr[$mark_index] = "<mark>" . $arr[$mark_index] . "</mark>";
    $arr_final = array_slice($arr, max($mark_index - 3,0),6);
    return join(" ",$arr_final);
    }

    // Comprobamos que ambos archivos son archivos de texto
    if($_FILES["txtOriginal"]["type"] === "text/plain" && $_FILES["txtPrueba"]["type"] === "text/plain"){
    echo "<h1>Resultados:</h1>";

    // Obtenemos el texto de cada archivo
    $texto_original = file_get_contents($_FILES["txtOriginal"]["tmp_name"]);
    $texto_prueba = file_get_contents($_FILES["txtPrueba"]["tmp_name"]);

    // Separamos los textos por salto de linea en arrays
    $array_aux_texto_original = $array_texto_original = preg_split("/[\n\r]/", $texto_original);
    $array_aux_texto_prueba = $array_texto_prueba = preg_split("/[\n\r]/", $texto_prueba);

    // Obtenemos la longitud de cada array para usarla en los siguientes for
    $array_texto_original_length = count($array_texto_original);
    $array_texto_prueba_length = count($array_texto_prueba);

    // Sanitizamos los arrays de caracteres raros
    for($a = 0; $a < $array_texto_original_length; $a++){
    $array_texto_original[$a] = strtolower(filterSpecialChars($array_texto_original[$a]));
    }

    for($b = 0; $b < $array_texto_prueba_length; $b++){
    $array_texto_prueba[$b] = strtolower(filterSpecialChars($array_texto_prueba[$b]));
    }

    // Comenzamos a buscar cada linea del original en el contenido a probar
    $everythingOK = true;
    for($c = 0; $c < $array_texto_original_length; $c++){
    if($array_texto_original[$c] !== ""){
    $haystack_index = searchSimilarItem($array_texto_original[$c],$array_texto_prueba);
    if($haystack_index > -1){
    $palabras_original = preg_split("/[\s]+/", $array_aux_texto_original[$c]);
    $palabras_prueba = preg_split("/[\s]+/", $array_aux_texto_prueba[$haystack_index]);
    $cantidad_palabras_original = count($palabras_original);
    for($e = 0; $e < $cantidad_palabras_original; $e++){
    if(filterSpecialChars(strtolower($palabras_original[$e])) !== filterSpecialChars(strtolower($palabras_prueba[$e]))){
    $everythingOK = false;
    echo '<div class="panel panel-warning"><div class="panel-heading"><b>Linea #' . ($c+1) . ', palabra #' . ($e+1) . ' del texto original!</div><div class="panel-body"><p>Texto original:</p><code>' . getMarkedSection($palabras_original,$e) .'</code><p>Texto comparado:</p><code>' . getMarkedSection($palabras_prueba,$e) .'</code></div></div>';
    //echo '<div class="panel panel-warning"><div class="panel-heading"><b>Linea #' . ($c+1) . ' del texto original!</div><div class="panel-body"><code>' . filterSpecialChars(strtolower($palabras_original[$e])) . '</code><br><code>' . filterSpecialChars(strtolower($palabras_prueba[$e])) . '</code></div></div>';
    break;
    }
    }
    }else{
    $everythingOK = false;
    echo '<div class="panel panel-danger"><div class="panel-heading"><b>Problemas! </b>No pudimos encontrar el texto de la linea <u>' . ($c + 1) . '</u> en el texto a probar</div><div class="panel-body">' . $array_aux_texto_original[$c] . '</div></div>';
    }
    }
    }
    if($everythingOK){
    echo "<div class='alert alert-success' role='alert'><b>Listo! </b>Todo concuerda!</div>";
    }
    echo "<button onclick='location.reload()' class='btn btn-block btn-info'>Volver a probar</button><hr>";
    }else{
    echo '<div class="alert alert-warning" role="alert"><b>Error:</b> Ambos archivos deben ser archivos de texto</div>';
    }
    }
    ?>
    <div class="panel panel-default">
    <div class="panel-heading">Comparador de textos</div>
    <div class="panel-body">
    <form action="comparador.php" method="post" enctype="multipart/form-data">
    <div class="form-group">
    <label for="txtOriginal">Texto original</label>
    <input type="file" id="txtOriginal" name="txtOriginal">
    <p class="help-block">Archivo en formato txt</p>
    </div>
    <div class="form-group">
    <label for="txtPrueba">Texto a poner a prueba</label>
    <input type="file" id="txtPrueba" name="txtPrueba">
    <p class="help-block">Archivo en formato txt</p>
    </div>
    <input type="submit" value="Comparar" name="submit" class="btn btn-primary">
    </form>
    </div>
    </div>
    </div>
    </div>
    </body>
    </html>