php preg replace удалить всю строку (из блока из многих строк), если она содержит появление слова
ребята ( гуру требуем );
Я ищу фрагмент preg_replace, который я могу использовать в файле php, где, если слово появляется в определенной строке, вся строка удаляется / заменяется пустой строкой
псевдокод:
$unwanted_lines=array("word1","word2"."word3");
$new_block_of_lines=preg_replace($unwanted_lines, block_of_lines);
Thanx, Марко!--2-->
3 ответов
выражение
во-первых, давайте разработаем выражение, которое вам нужно будет соответствовать массиву слов:
/(?:word1|word2|word3)/
на (?: ... )
expression создает группу без захвата ее содержимого в ячейку памяти. Слова разделены символом трубы, так что он соответствует любому слову.
чтобы создать это выражение с помощью PHP, вам нужна следующая конструкция:
$unwanted_words = array("word1", "word2", "word3");
$unwanted_words_match = '(?:' . join('|', array_map(function($word) {
return preg_quote($word, '/');
}, $unwanted_words)) . ')';
вам нужно preg_quote()
для создания действительного регулярное выражение из обычной строки, Если вы не уверены, что оно действительно, например "abc"
не нужно цитировать.
Читайте также: array_map()
preg_quote()
использование массива строк
вы можете разделить текст в массив строк:
$lines = preg_split('/\r?\n/', $block_of_lines);
затем, вы можете использовать preg_grep()
отфильтровать строки, которые не соответствует и произвести еще один массив:
$wanted_lines = preg_grep("/$unwanted_words_match/", $lines, PREG_GREP_INVERT);
Читайте также: preg_split()
preg_grep()
С помощью одного preg_replace()
чтобы соответствовать целой строке, содержащей нежелательное слово внутри блока текста с несколькими строками, вам нужно использовать якоря строк, например:
/^.*(?:word1|word2|word3).*$/m
С помощью /m
модификатор, якоря ^
и $
соответствует началу и концу строки соответственно. The .*
С обеих сторон "флеш" выражение слева и справа от совпадающего слова.
следует отметить, что $
игр перед фактический символ окончания строки (либо \r\n
или \n
). Если вы выполняете замену, используя приведенное выше выражение, она не заменит сами окончания строки.
вам нужно соответствовать этим дополнительным символам, расширяя выражение следующим образом:
/^.*(?:word1|word2|word3).*$(?:\r\n|\n)?/m
я добавил (?:\r\n|\n)?
за $
якорь на матч необязательный конец строки. Это окончательный код для выполнения замены:
$replace_match = '/^.*' . $unwanted_words_match . '.*$(?:\r\n|\n)?/m';
$result = preg_replace($replace_match, '', $block_of_lines);
это регулярное выражение может удалить совпадение из строки
$newstring = preg_replace("/^.*word1.*$/", "", $string);
как отметил @jack, давайте просто использовать preg_quote()
&&array_map()
$array = array('word1', 'word2', 'word3', 'word#4', 'word|4');
$text = 'This is some random data1
This is some word1 random data2
This is some word2 random data3
This is some random data4
This is some word#4 random data5
This is some word|4 random data6
This is some word3 random data7'; // Some data
$array = array_map(function($v){
return preg_quote($v, '#');
}, $array); // Escape it
$regex = '#^.*('. implode('|', $array) .').*$#m'; // construct our regex
$output = preg_replace($regex, '', $text); // remove lines
echo $output; // output