2

こんにちは、次の基準を維持する正規表現を構築しようとしています。

この例で検閲される単語は「ビュー」です。検閲の後に使用する文字: 「%」。「*」は投稿の書式設定を台無しにするため。

単語の使用例:
ビュー
ビュー
プレビュー素晴らしい景色
を見に行きました。素晴らしい景色
でしたね。

単語検閲後の例:
%%%%
ビュー
プレビュー
素晴らしい %%%% を見に行きました
%%%% は素晴らしかったですね。

ここに私が持っているいくつかのコードがあります:

$string = preg_replace_callback('/\s*'. preg_quote($word, '\\') .'\s*/is', 'bbcode_callback_censored', $string);

問題は、正規表現「\ s」で「*」を使用しているため、これが現在すべてに一致することです。私の基準を満たすために私ができることはありますか?

4

4 に答える 4

2

空白と一致しないでください。単語境界を使用してください

試す

$string = preg_replace_callback('/\b'. preg_quote($word, '\\') .'\b/is', 'bbcode_callback_censored', $string);

ここでRegexrを参照してください

のコンテンツが単語以外の文字で始まったり終わったりしていないことを確認するだけで$word、単語の境界は機能しません。

\b単語境界です。\wこれは、単語文字 ( で定義) から で定義されている非単語文字への変更\W、またはその逆に一致します。

代替:空白境界

「#view」などの単語以外の文字で単語の開始または終了を置き換える可能性があるため、単語の境界が気に入らない場合は、次のように独自の「空白境界」を定義します。

(?<=^|\s)#view(?=$|\s)

ここでRegexrを参照してください

このようにあなたのコードに見えます

$string = preg_replace_callback('/(?<=^|\s)'. preg_quote($word, '\\') .'(?=$|\s)/is', 'bbcode_callback_censored', $string);

(?<=^|\s)文字列の開始または空白が前にある場合に一致します

(?=$|\s)文字列の末尾または空白が先にある場合に一致します

于 2012-05-16T12:57:31.967 に答える
1

この単純なタスクには、遅くてメモリを大量に消費する正規表現エンジンを使用する必要はありません。使用するstr_replaceと、検索文字列のすべての出現箇所が置換文字列に置き換えられます。

$string = str_replace(' view ','%',$string);
于 2012-05-16T12:58:53.893 に答える
0
$str = "view viewing view view";
$str = preg_replace('/(^|\b)view(\b|$)/is', ' %%%% ', $str);
echo $str;
于 2012-05-16T13:01:36.263 に答える
0

これでいい...

$text_without_views = preg_replace('/(^|\W)view($|\W)/','\1***\2',$text_with_views);
于 2012-05-16T12:57:45.460 に答える