8

みんな ( preg_replace 達人 );

php ファイルで使用できる preg_replace スニペットを探しています。これにより、特定の行に単語が表示された場合、その行全体が削除/空の行に置き換えられます

疑似コード:

$unwanted_lines=array("word1","word2"."word3");
$new_block_of_lines=preg_replace($unwanted_lines, block_of_lines);

ありがとう。

4

3 に答える 3

8

表現

まず、単語の配列に一致させるために必要な式を考えてみましょう。

/(?:word1|word2|word3)/

式は、その(?: ... )内容をメモリ ロケーションにキャプチャせずにグループを作成します。単語はパイプ記号で区切られているため、どちらの単語にも一致します。

この式を 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と、アンカー^$がそれぞれ行の始点と終点に一致します。.*両側の は、一致した単語の左右の式を「フラッシュ」します。

注意すべきことの 1 つは、実際の行末文字 (または) の直前に$一致することです。上記の式を使用して置換を実行すると、行末自体は置換されません。\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);

デモ

于 2013-07-04T09:21:48.293 に答える
1

この正規表現は、行から一致を削除できます

$newstring = preg_replace("/^.*word1.*$/", "", $string);
于 2013-07-04T09:13:14.833 に答える
1

preg_quote()@jackが指摘したように、 &&を使用しましょう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

オンラインデモ

于 2013-07-04T09:19:36.893 に答える