PHP para buscar dentro del archivo txt y hacer eco de toda la línea

8 minutos de lectura

PHP para buscar dentro del archivo txt y hacer eco
aullah

Usando php, estoy tratando de crear un script que buscará dentro de un archivo de texto y tomará esa línea completa y la repetirá.

Tengo un archivo de texto (.txt) titulado “numorder.txt” y dentro de ese archivo de texto, hay varias líneas de datos, con nuevas líneas ingresando cada 5 minutos (usando el trabajo cron). Los datos se parecen a:

2 aullah1
7 name
12 username

¿Cómo haría para crear un script php que buscará los datos “aullah1” y luego tomará la línea completa y la repetirá? (Una vez repetido, debería mostrar “2 aullah1” (sin comillas).

Si no expliqué algo claramente y/o desea que lo explique con más detalle, por favor comente.

  • “Llegan nuevas líneas cada 5 minutos”: suena como una gran cantidad de datos. Tal vez debería repensar lo que sea que esté haciendo y usar alguna base de datos para almacenar los valores. De lo contrario, php tendrá grandes problemas con el tamaño creciente de ese archivo.

    – dar un toque

    10 de septiembre de 2010 a las 16:16

  • Hola poke, gracias por tu respuesta y preocupación. 😉 El archivo no será demasiado grande, de hecho, creo que por el momento solo tiene aproximadamente 150 líneas. Aunque se actualiza cada 5 minutos, puede ser solo 1 línea o hasta 20 líneas a la vez. En determinadas ocasiones puedo borrar las líneas para restablecer los datos. La única razón por la que mencioné que las líneas se actualizan es para que cuando busque dentro del archivo de texto, no obtenga una respuesta basada en líneas. Una vez más, realmente aprecio su respuesta y gracias. 😉

    – aullah

    10 de septiembre de 2010 a las 16:30


  • posible duplicado del script PHP para tomar toda la línea

    – Gordon

    14 de abril de 2011 a las 12:27

  • github.com/skfaisal93/AnywhereInFiles

    – Faisal Shaikh

    31 de diciembre de 2015 a las 15:20

PHP para buscar dentro del archivo txt y hacer eco
Lekensteyn

Y un ejemplo de PHP, se mostrarán varias líneas coincidentes:

<?php
$file="somefile.txt";
$searchfor="name";

// the following line prevents the browser from parsing this as HTML.
header('Content-Type: text/plain');

// get the file contents, assuming the file to be readable (and exist)
$contents = file_get_contents($file);
// escape special characters in the query
$pattern = preg_quote($searchfor, "https://stackoverflow.com/");
// finalise the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
   echo "Found matches:\n";
   echo implode("\n", $matches[0]);
}
else{
   echo "No matches found";
}

  • Querías decir preg_match_all?

    – dar un toque

    10 de septiembre de 2010 a las 16:13

  • Sí, lo hice, estoy acostumbrado a la bandera JS ‘g’: usando una función: o

    – Lekenstein

    10 de septiembre de 2010 a las 16:26

  • Hola Lekensteyn, estoy muy agradecido por tu respuesta y me gusta tu codificación. Me encantaría usar este script, sin embargo, cada vez que reemplazo el texto “nombre” dentro de la variable $buscar, siempre aparece el error “No se encontraron coincidencias”. Por supuesto, eso es probablemente sólo yo. Puede haber muchos problemas que causen esto, y trataré de averiguar lo que sea, pero ¿crees que podría ser la codificación? Una vez más, me disculpo si estoy causando molestias y aprecio mucho su respuesta y sus esfuerzos. Gracias. 😉

    – aullah

    10 de septiembre de 2010 a las 16:38

  • Agregado m bandera y cambiado implode("\n", $matches) para implode("\n", $matches[0]). Lo probé, y ahora funciona. Pruébalo otra vez 🙂

    – Lekenstein

    10 de septiembre de 2010 a las 19:46

  • ^*. no es una expresión regular válida… no es un error, así que revertí ese cambio.

    – Lekenstein

    10 de diciembre de 2015 a las 11:31

Hazlo asi. Este enfoque le permite buscar una archivo de cualquier tamaño (el tamaño grande no bloqueará el script) y volverá TODAS las líneas que coinciden la cuerda que quieras.

<?php
$searchthis = "mystring";
$matches = array();

$handle = @fopen("path/to/inputfile.txt", "r");
if ($handle)
{
    while (!feof($handle))
    {
        $buffer = fgets($handle);
        if(strpos($buffer, $searchthis) !== FALSE)
            $matches[] = $buffer;
    }
    fclose($handle);
}

//show results:
print_r($matches);
?>

Tenga en cuenta la forma strpos se usa con !== operador.

  • La única queja que tendría es suprimir el error. En mi opinión, es mejor desactivar display_errors cuando está en producción, pero al menos de esta manera verá cualquier error y podrá corregirlo mientras está en desarrollo. Sin embargo, +1 para una buena respuesta.

    – Jim

    10 de septiembre de 2010 a las 16:41

  • Hola Shamittomar, gracias por tu respuesta. ¡Lo aprecio mucho y tu codificación! Gracias. 😉 Sin embargo, una cosa es que realmente no me gusta la idea de cómo se muestra el resultado dentro de una matriz, ya que necesito que el resultado se muestre al usuario final eventualmente. 🙁 Por supuesto, agradezco su respuesta, así como su codificación. Gracias. 😉

    – aullah

    10 de septiembre de 2010 a las 16:43


  • @AUllah. De nada. Acabo de imprimir la matriz de resultado. Depende de usted mostrar la matriz de la forma que desee. hacer un foreach bucle de la $matches y repite los resultados con tu estilo y elección.

    – Shamittomar

    10 de septiembre de 2010 a las 17:17

  • @premiso, sí, estoy completamente de acuerdo con esa práctica. sin embargo, el if($handle) puede tener un else con decir que el archivo no se abrió correctamente. Me gusta más este enfoque. Sólo una cuestión de elección.

    – Shamittomar

    10 de septiembre de 2010 a las 17:18


  • Sí, lo demás sería bueno para los errores fáciles de usar. Pero también es bueno tener el error real mientras está desarrollando.

    – Jim

    10 de septiembre de 2010 a las 17:38

1646760911 357 PHP para buscar dentro del archivo txt y hacer eco
Frxstrem

Utilizando file() y strpos():

<?php
// What to look for
$search="foo";
// Read from file
$lines = file('file.txt');
foreach($lines as $line)
{
  // Check if the line contains the string we're looking for, and print if it does
  if(strpos($line, $search) !== false)
    echo $line;
}

Cuando se prueba en este archivo:

foozah
barzah
abczah

Produce:

foozah


Actualizar:

Para mostrar texto si no se encuentra el texto, use algo como esto:

<?php
$search="foo";
$lines = file('file.txt');
// Store true when the text is found
$found = false;
foreach($lines as $line)
{
  if(strpos($line, $search) !== false)
  {
    $found = true;
    echo $line;
  }
}
// If the text was not found, show a message
if(!$found)
{
  echo 'No match found';
}

Aquí estoy usando el $found variable para averiguar si se encontró una coincidencia.

  • Hola Frxstrem, gracias por tu respuesta. Me gusta mucho y agradezco tu respuesta. El código parece funcionar fabulosamente, si es posible, ¿crees que existe la posibilidad de agregar una línea “else” contra ese “if”. ¿Algo en las líneas como “No encontrado”? Una vez más, disculpas si pido demasiado, tal como está, está bien. Agradezco su respuesta y muchas gracias! 😉

    – aullah

    10 de septiembre de 2010 a las 16:49

  • @ AUllah1: es bastante fácil de hacer, así que actualicé mi respuesta con eso

    – Frxstrem

    10 de septiembre de 2010 a las 19:26


  • ¿Qué pasa con la coincidencia exacta? Digamos que tengo 1.2.3.4 y 1.1.2.45 y luego buscar 1.2.3.4 también generará 1.1.2.45

    – MaXi32

    12 de noviembre de 2020 a las 9:35

$searchfor = $_GET['keyword'];
$file="users.txt";

$contents = file_get_contents($file);
$pattern = preg_quote($searchfor, "https://stackoverflow.com/");
$pattern = "/^.*$pattern.*\$/m";

if (preg_match_all($pattern, $contents, $matches)) {
    echo "Found matches:<br />";
    echo implode("<br />", $matches[0]);
} else {
    echo "No matches found";
    fclose ($file); 
}

parece que es mejor que salgas del sistema para system("grep \"$QUERY\"") ya que ese script no tendrá un rendimiento particularmente alto de ninguna manera. De lo contrario http://php.net/manual/en/function.file.php le muestra cómo recorrer las líneas y puede usar http://php.net/manual/en/function.strstr.php para encontrar coincidencias.

  • Hola Novikov, gracias por tu respuesta, lo aprecio mucho, así como tus esfuerzos. Intentaré ver si puedo encontrar cara y cruz con los enlaces que has proporcionado. 😉 La razón por la que no puedo usar el enfoque del sistema es que eventualmente convertiré el script en una búsqueda. Por supuesto, disculpas por no haber dicho esto claramente. Que es mi culpa. Lo siento, y gracias por tu respuesta. 😉

    – aullah

    10 de septiembre de 2010 a las 16:34

  • Realmente no desea pasar nada a system(), shell_exec(), exec(), etc. sin usar escapeshellarg() … a menudo crea un gran problema de seguridad 🙂

    –Craig Francis

    3 de enero de 2018 a las 14:53

1646760911 601 PHP para buscar dentro del archivo txt y hacer eco
crayón violento

de una sola mano…

$needle = "blah";
$content = file_get_contents('file.txt');
preg_match('~^(.*'.$needle.'.*)$~',$content,$line);
echo $line[1];

aunque probablemente sería mejor leerlo línea por línea con fopen() y fread() y usar strpos()

  • Hola Novikov, gracias por tu respuesta, lo aprecio mucho, así como tus esfuerzos. Intentaré ver si puedo encontrar cara y cruz con los enlaces que has proporcionado. 😉 La razón por la que no puedo usar el enfoque del sistema es que eventualmente convertiré el script en una búsqueda. Por supuesto, disculpas por no haber dicho esto claramente. Que es mi culpa. Lo siento, y gracias por tu respuesta. 😉

    – aullah

    10 de septiembre de 2010 a las 16:34

  • Realmente no desea pasar nada a system(), shell_exec(), exec(), etc. sin usar escapeshellarg() … a menudo crea un gran problema de seguridad 🙂

    –Craig Francis

    3 de enero de 2018 a las 14:53

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad