2010-02-15 22 views
5

chicos tengo un archivo de texto y quiero eliminar algunas líneas que contengan determinadas palabrasEliminar la línea contiene palabras/frases específicas con PHP

<?php 
// set source file name and path 
$source = "problem.txt"; 

// read raw text as array 
$raw = file($source) or die("Cannot read file"); 

ahora hay variedad de la que quiero eliminar algunas líneas y desea para usarlos así sucesivamente.

Respuesta

7

medida que tiene cada línea de su archivo en una fila de una matriz, la función array_filter vez te interesa (citando):

array array_filter (array $input [, callback $callback ]) 

Repite cada valor de la entrada array pasándolos a la función de devolución de llamada .
Si la función de devolución de llamada devuelve verdadero, el valor actual de la entrada se devuelve a la matriz de resultados . Las teclas del array son preservadas.

Y puede utilizar strpos o stripos para determinar si una cadena está contenida en otra.


Por ejemplo, supongamos que tenemos esta matriz:

$arr = array(
    'this is a test', 
    'glop test', 
    'i like php', 
    'a badword, glop is', 
); 

podríamos definir una función de devolución de llamada que filtrar las líneas que contienen "glop":

function keep_no_glop($line) { 
    if (strpos($line, 'glop') !== false) { 
    return false; 
    } 
    return true; 
} 

Y el uso de esa función con array_filter:

$arr_filtered = array_filter($arr, 'keep_no_glop'); 
var_dump($arr_filtered); 

Y que tendríamos este tipo de salida:

array 
    0 => string 'this is a test' (length=14) 
    2 => string 'i like php' (length=10) 

es decir, hemos eliminado todas las líneas que contienen el "bad words" "pastoso".


Por supuesto, ahora que tiene la idea básica, nada impide que utilice una llamada de retorno más complejo ;-)


Edición después de comentarios: aquí está una porción de código que completa debería funcionar:

En primer lugar, usted tiene su lista de líneas:

$arr = array(
    'this is a test', 
    'glop test', 
    'i like php', 
    'a badword, glop is', 
); 

Luego, carga la lista de palabras incorrectas de un archivo:
Y recorta cada línea, y elimina las líneas vacías, para asegurarse de que solo termina con "palabras" en la matriz $bad_words, y no cosas en blanco que causarían nubes.

$bad_words = array_filter(array_map('trim', file('your_file_with_bad_words.txt'))); 
var_dump($bad_words); 

La matriz $bad_words contiene, de mi archivo de prueba:

array 
    0 => string 'glop' (length=4) 
    1 => string 'test' (length=4) 

A continuación, la función de devolución de llamada, que se repite sobre esa matriz de malas palabras:
Nota: el uso de una variable global no es que nice :-(Pero la función de devolución de llamada llamada por array_filter no obtiene ningún otro parámetro, y no quería cargar el archivo cada vez que se llama a la función de devolución de llamada.

function keep_no_glop($line) { 
    global $bad_words; 
    foreach ($bad_words as $bad_word) { 
     if (strpos($line, $bad_word) !== false) { 
     return false; 
     } 
    } 
    return true; 
} 

Y, como antes, se puede utilizar para filtrar los array_filter líneas:

$arr_filtered = array_filter($arr, 'keep_no_glop'); 
var_dump($arr_filtered); 

Lo que, esta vez, le da:

array 
    2 => string 'i like php' (length=10) 

Espero que esto ayude.

+0

muchas gracias por explicar todo – Jimmy

+1

De nada :-) Diviértete! –

+0

solo dime qué hacer si quiero agregar una lista de palabras, por ejemplo, si puedo escribir otra lista de palabras, una palabra por línea, entonces? y si quiero agregar más palabras con glop – Jimmy

2

Echa un vistazo a la función strpos. Puede decirle si una cadena contiene otra cadena o no (y dónde exactamente está la primera cadena en el segundo). Se podría utilizar de esta manera:

$good = array(); 
$bad_words = array('martin', 'methew'); 

// for every line in the file 
foreach($raw as $line) { 
    // check for each word we want to avoid 
    foreach($bad_words as $word) { 
    // if this line has a trigger word 
    if(strpos($line, $word) !== false) { 
     // skip it and start processing the next 
     continue 2; 
    } 
    } 

    // no triggers hit, line is clean 
    $good[] = $line; 
} 

Ahora tendría una lista de sólo las líneas limpias en $good.

+0

solo dime qué hacer si quiero hacer otras badwords.txt y utilícelo con esta solución, lo intenté pero fallé, acctually no quiero volver a abrir el código n otra vez: D gracias por la ayuda – Jimmy

0
<?php 
$source = "problem.txt"; 
$raw = file_get_contents($source) or die("Cannot read file"); 
$wordlist = "martin|methew|asshole"; 
$raw = preg_replace("/($wordlist)/ie", "", $raw); 
file_put_contents($source, $raw); 
?> 
+0

guau increíble ayuda rápidamente y ahora estoy demasiado contento y confundido: D bueno, estoy seguro algo gona trabajo, muchas gracias chicos dios te bendiga – Jimmy

2

Esto eliminará todos los filas que tienen una palabra en la lista negra en ella:

$rows = file("problem.txt");  
$blacklist = "foo|bar|lol"; 

foreach($rows as $key => $row) { 
    if(preg_match("/($blacklist)/", $row)) { 
     unset($rows[$key]); 
    } 
} 

file_put_contents("solved.txt", implode("\n", $rows)); 

O, si usted está usando PHP 5.3, puede utilizar una función lambda con array_filter:

$rows = file("problem.txt");  
$blacklist = "foo|bar|lol"; 
$rows = array_filter($rows, function($row) { 
    return preg_match("/($blacklist)/", $row); 
}); 

file_put_contents("solved.txt", implode("\n", $rows)); 

Antes de PHP 5.3, una solución que utilizara array_filter realmente consumiría más filas que la primera solución que publiqué, así que lo dejaré.

1

asumiendo que tiene una serie de "malas palabras":

<?php 
foreach ($raw as $key=>$line) 
{ 
    foreach ($badwords as $w) 
    { 
     if (strpos($line, $w) !== false) 
      unset($raw[$key]); 
    } 
} 
?> 
2
$file=file("problem.txt"); 
$a = preg_grep("/martin|john/",$file,PREG_GREP_INVERT); 
print_r($a); 
2

Si usted tiene una larga cadena en lugar de un archivo y que desea eliminar todas las líneas de cadena que tiene palabras específicas. Puede usar esto:

$string="I have a long string\n 
    That has good words inside.\n 
    I love my string.\n 
    //add some words here\n"; 
$rows = explode("\n",$string); 
$unwanted = "tring|\/\/"; 
$cleanArray= preg_grep("/$unwanted/i",$rows,PREG_GREP_INVERT); 
$cleanString=implode("\n",$cleanArray); 
print_r ($cleanString); 

Esto elimina que las líneas contengan "tring" y "//".

Cuestiones relacionadas