2016-05-22 7 views
1

私は自分のサイトで特定の種類の投稿を防止しようとしています。具体的には、ポストはランダムな単語、改行文字、ランダムな文字です。PHP preg_matchは連続した改行文字に一致します

したがって、2人の改行文字を使用して(段落間に空白行を作成するために)使用する正当なユーザーがいるかもしれませんが、3+はスパムとしてマークすることができます。

私はこのregexをregex101でテストしましたが正常に動作しますが、私は自分のサイトでテストしたときに決して起動しません。エコーラインのコメントを外すと、テストデータの番号4が表示されるので、改行が見えます。私の正規表現は間違っていますか?

テストデータ:

This is a potential 


spam post 

コード:

//echo substr_count($lowercaseBody, "\n"); 
if (preg_match('/\n{3,}./', $lowercaseBody)){ 
    error("Stop Spamming my chan you ."); 
} 
+1

試み: - '[\ n個の\ rを] {3} ' – rock321987

+0

あなたのテストデータには2つの新しい行しかないようです:['(\ n {2}) '](https://regex101.com/r/sB6pE0/1) – AKS

+0

@AKSそれはSOの問題です。複数の改行をシングルにしてください。質問を編集するには – rock321987

答えて

1

データの可能性が高いCRLF年代だけでなく、LF年代が含まれています。

substr_countテストでは、インターリーブについては気にしませんCRさんの正規表現パターンはありません。

CRLF年代とLFの両方できるようにする代わりに\nの使用(\r?\n)(異なるブラウザ/ OSの者を、別の新しいラインを使用することができます):

if (preg_match('/(\r?\n){3,}./', $lowercaseBody)){ 
    error("Stop Spamming my chan you ."); 
} 
+0

上記の解説者の一人も同様のものを提供しましたが、これは正しい解決策でした。あなたは私に何を教えてくれますか?正規表現で? –

+0

また、これらの文字を将来どのように決定するか教えていただけますか?エコーはこれらを表示しないことを意味します。私はいつもデータをループすることができると思いますが、もっと簡単なことはありますか? –

+1

これは '\ r'(' CR')がオプションであることを意味します。 '\ r \ n'(' CRLF')または '\ n'(' LF')の両方にマッチするようにします。 –

関連する問題