2010-02-15 7 views
5

les gars, j'ai un fichier texte et je veux supprimer certaines lignes qui contiennent des mots spécifiquesSupprimer la ligne contient des mots/phrases spécifiques avec PHP

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

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

maintenant il y a tableau dont je veux supprimer certaines lignes et que vous souhaitez pour les utiliser ainsi de suite.

Répondre

7

Comme vous l'avez chaque ligne de votre fichier dans une rangée d'un tableau, la fonction array_filter pourrait vous intéresser (citant):

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

Répète chaque valeur dans l'entrée les transmettre à la fonction de rappel .
Si la fonction de rappel renvoie la valeur true, la valeur actuelle de l'entrée est renvoyée dans le tableau de résultats . Les clés de tableau sont conservées.

Et vous pouvez utiliser strpos ou stripos pour déterminer si une chaîne est contenue dans un autre.


Par exemple, supposons que nous avons ce tableau:

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

On pourrait définir une fonction de rappel qui filtrer les lignes contenant « glop »:

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

Et utiliser cette fonction avec:

Et nous obtiendrions ce genre de sortie:

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

dire que nous avons supprimé toutes les lignes contenant le « BADWORD » « glop ».


Bien sûr, maintenant que vous avez l'idée de base, rien ne vous empêche d'utiliser une fonction plus de rappel complexe ;-)


Modifier après les commentaires: est ici une partie pleine de code devrait fonctionner:

tout d'abord, vous avez votre liste de lignes:

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

Ensuite, vous chargez la liste des mots incorrects à partir d'un fichier:
Et vous rognez chaque ligne et supprimez les lignes vides, pour vous assurer que vous ne finissez avec des "mots" dans le tableau $bad_words, et pas des choses vides qui causeraient troubles.

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

Le tableau $bad_words contient, de mon fichier de test:

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

Ensuite, la fonction de rappel, qui passe en boucle sur ce tableau de mauvais mots:
Note: en utilisant une variable globale est pas belle :-(Mais la fonction de rappel appelée par array_filter ne soit pas tout autre paramètre, et je ne voulais pas charger le fichier à chaque fois que la fonction de rappel est appelée.

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

Et, comme avant, vous pouvez utiliser array_filter pour filtrer les lignes:

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

qui, cette fois, vous donne:

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

Hope this helps.

+0

merci beaucoup pour expliquer l'ensemble – Jimmy

+1

Vous êtes les bienvenus :-) Amusez-vous! –

+0

Dites-moi simplement wat à faire si je veux ajouter une liste de mots, comme si je peux écrire une autre liste de mots, un mot par ligne alors? et si je veux ajouter plus de mots avec glop – Jimmy

2

Vérifiez la fonction strpos. Il peut vous dire si une chaîne contient une autre chaîne ou pas (et où exactement la première chaîne est dans la seconde). Vous l'utiliser comme ceci:

$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; 
} 

Maintenant, vous auriez une liste de lignes seulement propres à $good.

+0

il suffit de me dire comment faire si je veux faire un autre badwords.fichier txt et l'utiliser avec cette solution, j'ai essayé mais échoué, en fait, je ne veux pas ouvrir à nouveau le code n encore: D merci pour l'aide – 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

wow aide étonnante rapidement et maintenant je trop heureux et confus: D bien im sûr Quelque chose travail gona, merci beaucoup les gars Dieu vous bénisse – Jimmy

2

Cela supprimera toutes les lignes qui ont un mot sur la liste noire en elle:

$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)); 

Ou, si vous utilisez PHP 5.3, vous pouvez utiliser une fonction lambda avec 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)); 

Avant PHP 5.3, une solution utilisant array_filter utilisait réellement plus de lignes que la première solution que j'avais publiée, donc je vais laisser tomber ça.

1

En supposant que vous avez un tableau de « mauvais mots »:

<?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 vous avez une longue chaîne plutôt que d'un fichier et que vous voulez supprimer toutes les lignes de chaîne qui a des mots spécifiques. Vous pouvez utiliser ceci:

$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); 

Ceci supprime que les lignes contiennent "tring" et "//".

Questions connexes