
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.

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";
}
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.

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.
$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.

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()
“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