php preg_replace remove entire line (from a block of many lines ) if it contains an occurence of a word
php, preg-replace, regex
Solution
The expression
First, let's work out the expression you will need to match the array of words:
/(?:word1|word2|word3)/
The `(?: ... )` expression creates a group without capturing its contents into a memory location. The words are separated by a pipe symbol, so that it matches either word.
To generate this expression with PHP, you need the following construct:
$unwanted_words = array("word1", "word2", "word3");
$unwanted_words_match = '(?:' . join('|', array_map(function($word) {
return preg_quote($word, '/');
}, $unwanted_words)) . ')';
You need `preg_quote()` to generate a valid regular expression from a regular string, unless you're sure that it's valid, e.g. `"abc"` doesn't need to be quoted.
See also: `array_map()` `preg_quote()`
Using an array of lines
You can split the block of text into an array of lines:
$lines = preg_split('/\r?\n/', $block_of_lines);
Then, you can use `preg_grep()` to filter out the lines that don't match and produce another array:
$wanted_lines = preg_grep("/$unwanted_words_match/", $lines, PREG_GREP_INVERT);
See also: `preg_split()` `preg_grep()`
Using a single `preg_replace()`
To match a whole line containing an unwanted word inside a block of text with multiple lines, you need to use line anchors, like this:
/^.*(?:word1|word2|word3).*$/m
Using the `/m` modifier, the anchors `^` and `$` match the start and end of the line respectively. The `.*` on both sides "flush" the expression left and right of the matched word.
One thing to note is that `$` matches just before the actual line ending character (either `\r\n` or `\n`). If you perform replacement using the above expression it will not replace the line endings themselves.
You need to match those extra characters by extending the expression like this:
/^.*(?:word1|word2|word3).*$(?:\r\n|\n)?/m
I've added `(?:\r\n|\n)?` behind the `$` anchor to match the optional line ending. This is the final code to perform the replacement:
$replace_match = '/^.*' . $unwanted_words_match . '.*$(?:\r\n|\n)?/m';
$result = preg_replace($replace_match, '', $block_of_lines);
Demo
Problem
Guys ( preg_replace gurus ); I am looking for a preg_replace snippet , that i can use in a php file whereby if a word appears in a particular line, that entire line is deleted/replaced with an empty line pseudocode: ``` $unwanted_lines=array("word1","word2"."word3"); $new_block_of_lines=preg_replace($unwanted_lines, block_of_lines); ``` Thanx.