• ベストアンサー

WordPressの質問(q10207678)の続

空白改行の文字が連続してはいけないという条件で正規表現を調べたところ、空白には色々な表現があるようでそれらを 1 つ 1 つ調べ上げるのは面倒なので、Unicode 文字プロパティを使ったほうがよいと参考サイトに書かれておりました。 マルチバイト対応の文字列に対する正規表現マッチングで作成するのが良いみたいですが、コードを調べても意味が分からずどうすれば良いか迷っております… 正規表現を使っている場合 ReDoS という攻撃があるようで、セキュリティ上の対策も必要なようです。 アドバイスお願い致します。 ※参考サイト https://qiita.com/fallout/items/a13cebb07015d421fde3

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.32

・カメラ画像をファイルアップロード時に非表示にするコードを追加するコードを考えてみたのですが、間違っているところはありますでしょうか? 実装してみました。 カメラ画像は非表示になったのでいいと思います。

php_learn
質問者

お礼

こちらが最新の質問になります。 質問の期限が切れており続きの質問を立てさせていただきました。アドバイスよろしくお願い致します。 https://okwave.jp/qa/q10226736.html

php_learn
質問者

補足

回答ありがとうございます。 CSSを確認ページまで設定して確認後に表示ページのコードを作成する予定です。

その他の回答 (31)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.11

方針が理解できていません。 標準のコメント、今回の質問掲示板、そしてさらにもうひとつ作成予定だったと思いますが別の掲示板。 これら三つの閲覧者投稿機能を、標準のコメントテーブル(wp_comment)は使用しないで、「sortable」(質問掲示板)、「sortable1」(仮名、標準のコメント)、「sortable2」(仮名、別の掲示板)としたような別々のテーブルで管理すると言うことでしょうか。

php_learn
質問者

補足

回答ありがとうございます。標準のコメント、質問掲示板、雑談掲示板の3つを予定しております。 標準のコメントテーブルを利用する場合コードがコードが複雑になるのではないかと思っております…

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.10

・掲示板用に作ったテーブル「sortable」はそのままで別途新しいテーブルを標準のコメント用に作成して、両方のコメントを承認制にすることは可能でしょうか? 可能だと思いますが、標準のコメントは標準のテーブルでいいと思います。 ・両テーブルが承認制である場合、テーブルを増やして、識別する機能を付け加えることで解決できるのではないかと考えております。 テーブルを増やす必要はないと思います。 識別する列があればいいと思います。

php_learn
質問者

補足

回答ありがとうございます。テーブルを識別する方法を調べてみたのですが記事が出てこずどうすれば良いか悩んでおります… アドバイスお願い致します。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.9

・1,不適切なワードを AI でチェックする そうですね。 私もAIに任せればと思ったのですが、見つかった情報が有料のものだったので、お知らせしませんでした。 そちらのAI機能で十分なチェックができるか試してみてください。 ・2,投稿時に表示フラグをfalseにして、管理者の管理画面で表示フラグをtrueにする(投稿をRDBで管理している場合) そうですね。 標準コメントもですし、私が想像していたのも同じ方法です。 ・標準のコメントのデータも掲示板のデータも承認制にすることで掲示板用に作ったテーブル「sortable」をそのまま維持して使う事は可能だと思われますでしょうか? 標準のコメントも「sortable」にすると言うことでしょうか。

php_learn
質問者

補足

Q.私もAIに任せればと思ったのですが、見つかった情報が有料のものだったので、お知らせしませんでした。 そちらのAI機能で十分なチェックができるか試してみてください。 A.回答ありがとうございます、色々考えてみたのですが AI による自動判定よりも CDN の導入に資金をかける方向で考えております。 webpurify を使用する場合1ドメインにつき5$かかるようで、AIの判断により即拒否するのは発言が制限されるのではないかと懸念しております… アクセスが増えた場合同時アクセスされた際のサイトの表示速度やウイルス攻撃面を強化したほうがコストパフォーマンスを考えると良さそうです。 ※AI による自動判定 https://www.webpurify.com/pricing/ ※考えられる問題 https://king.mineo.jp/reports/132711 ※CDNについて https://www.colorfulbox.jp/cdn/ Q.標準のコメントのデータも掲示板のデータも承認制にすることで掲示板用に作ったテーブル「sortable」をそのまま維持して使う事は可能だと思われますでしょうか? 標準のコメントも「sortable」にすると言うことでしょうか。 A.回答ありがとうございます、掲示板用に作ったテーブル「sortable」はそのままで別途新しいテーブルを標準のコメント用に作成して、両方のコメントを承認制にすることは可能でしょうか? 両テーブルが承認制である場合、テーブルを増やして、識別する機能を付け加えることで解決できるのではないかと考えております。 ・投稿時に表示フラグをfalseにして、管理者の管理画面で表示フラグをtrueにする(投稿をRDBで管理している場合)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.8

・※Apache を使いコメントを承認制にする これは興味深い方法ですが、作るのも運用するのも大変になりそうなので、下記の方法ができなければ、その時に改めて考慮すると言うことで、今ははずしておきましょう。 ・※WordPress の管理画面からコメントを承認制にする これはWordPress標準のコメント(記事へのコメント)機能を使うため、現在作成中の掲示板と共通で使えるようにするには工夫が必要です。 私が想像していたのは、このコメントの管理画面に似たようなものをまるまる作る方法です。 と言っても、簡単ではないので、作成に手間がかかります。 そう言う意味では、標準のコメント機能を改造する方が、管理画面をほぼそのまま使えるような気がします。 但し、現時点でうまくいくかどうかは断定できません。 まず、掲示板用に作ったテーブル「sortable」を使うのをやめて、標準の「wp_comments」を使うようになります。 それから、標準のコメントのデータなのか、掲示板のデータなのかを識別する方法が必要です。 「wp_comments」の項目のいずれかを使うか、「wp_commentmeta」を使うかすれば可能な気はします。 掲示板に質問や回答を表示する時に、その識別方法で抽出するようになります。 ただ、標準機能の使い方を調べるのに見ていた「WordPress Codex」が見れなくなってしまったようです。 移行したように書かれてはいるのですが、以前のような見やすさがなくて、調べるのに苦労しそうです。 https://ja.wordpress.org/2021/09/06/codex-to-helphub/

php_learn
質問者

補足

Q.※WordPress の管理画面からコメントを承認制にする これはWordPress標準のコメント(記事へのコメント)機能を使うため、現在作成中の掲示板と共通で使えるようにするには工夫が必要です。 A.回答ありがとうございます、記事へのコメントと競合する危険性がありそうですね。 Q.私が想像していたのは、このコメントの管理画面に似たようなものをまるまる作る方法です。 と言っても、簡単ではないので、作成に手間がかかります。 A.回答ありがとうございます、管理画面のようなものを別途作る方法も考えたのですが、どのような作りになるのか想像できませんでした… Q.ただ、標準機能の使い方を調べるのに見ていた「WordPress Codex」が見れなくなってしまったようです。 移行したように書かれてはいるのですが、以前のような見やすさがなくて、調べるのに苦労しそうです。 https://ja.wordpress.org/2021/09/06/codex-to-helphub/ A.アドバイスありがとうございます。参照していたサイトは調べにくそうですね… その他に方法がないか質問してみたところ2つほどあるようです。標準のコメントのデータも掲示板のデータも承認制にすることで掲示板用に作ったテーブル「sortable」をそのまま維持して使う事は可能だと思われますでしょうか? 1,不適切なワードを AI でチェックする ※参考サイト https://dev.classmethod.jp/articles/profanity-filter-saas/ 2,投稿時に表示フラグをfalseにして、管理者の管理画面で表示フラグをtrueにする(投稿をRDBで管理している場合)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.7

・最新コード NGワードを bbs_quest_input() 内で定義しても Chk_ngword() 内では使えません。 Chk_ngword() に定義した方がいいと思います。 ・参考サイト➀を見ると下記のような機能がついており、途中句読点が入っているものは対策が必要なのでしょうか? 必要かどうかは私からは言えません。 質問者さまがどうしたいかです。 なぜ、スペースや句読点の削除があると思いますか。 参考サイトでは説明されていないので、想像するしかありません。 私が想像したのはこのようなことからです。 例えば「死ね」と言うNGワードを想定してみます。 「死ね」を見つければそれでいいでしょうか。 いいえ。 「死 ね」「死、ね」「死。ね」と入力された場合は見つけられません。 これらは「死ね」ではないのでOKワードになってしまいます。 でも、人間はこれらを見た時に『死ね』と言われたように感じてしまいます。 なので、スペースや句読点を削除して、これらを「死ね」に変換して、「死ね」と一致するかチェックするわけです。 ではそれだけでいいのでしょうか。 いいえ。 参考サイトにはこうも書かれています。 「必要に応じて、記号も同様に削除するのも有り。」 つまり、「死×ね」「死/ね」「死☆ね」「死♪ね」とかにも対応せよ、と言うことです。 ええ!?記号がどれだけあるとお思いですか!? となりますよね。 それなら、記号をすべて削除してよ、ってことにもなります。 UTF8の記号はおそろしい数です。 すべて消す方法があるかどうかを検討する必要があります。 漢字の「死」を使ったので、見た人が「死」を連想するわけですが、ひらがなの「し」を使った場合を想像してみます。 「しね」の文字を見たら、やはり見た人はいい気はしません。 そうなると「しね」もNGワードにする必要があります。 でもそんな簡単な話しにはならないです。 「赤にするとへんですしね」と書かれたら該当してしまうからです。 このような言いまわしをする人がいるかどうかはわかりませんが、「しね」の他にも、NGワードにしたい言葉が、通常会話の中にまぎれこんでくるかも知れません。 「ばか」も「赤ばかり使う」とか。 「死ぬ」がOKワードだった場合、「死ぬれ」と言う言い方をする人もいるかも知れません。 「ばか」を「かば」と書く人もいるかも知れません。 NGワードをどこまで対応するかというのは技術や方法だけの話しではなくなってくるので、とても難しいです。 最低限のこれだけの単語は、では対応しているとは言えなくなってしまいます。 そんなの考えたらきりがない、って思うようでしたら、記号については対応しなくていいような気もします。 それ言ったら、スペースや句読点は?ってことになって、それも対応しないとか。 どうどうめぐりになるので、質問者さまがどうしたいか、です。 私個人はNGワードの対応は不要だと思っているくらいです。 そもそもNGワードをどこまで準備できるのか、みかけたら随時追加していくのか、なんて考えたくないからです。 プログラムかデータのメンテナンスが必須になってきます。 そのきりのない対応をするよりも、本気で対応するのであれば、投稿直後に公開するのをやめて、管理者がチェックしてから、公開するか否か決める、と言う人手を使うのが理想だと思っています。 その方が、より確実に荒らし行為や非道徳発言に対応できるからです。 管理者がそこまでできないのであれば、閲覧者が通報した時点ですぐに非表示にする機能を追加してしまうかです。 管理者は都合のいいタイミングで投稿内容を添削するか削除するかそのまま再表示するかを検討します。 やたら通報する人がでてくるかも知れませんが、NGワードが表示されるよりましかと思います。 それにはそれで、違うIPアドレスから通報が3回あったら非表示にするとかでもいいかも知れません。 ・参考サイト➁では特に難しいコードがなくそちらを参考にしているのですが、英語に対応する場合に小文字大文字関係なくNGワードとして機能するのか心配です… https://www.php.net/manual/ja/function.mb-stripos.php mb_stripos — 大文字小文字を区別せず、 文字列の中で指定した文字列が最初に現れる位置を探す と書かれているので、大丈夫ではないでしょうか。

php_learn
質問者

お礼

こちらが最新の質問になります。文字がひらがなか、カタカナか、漢字か、英数字か調べる方法も見つけたのですが、英字の許容範囲が広いため穴が多く記号をブロックできても Unicode 表のものを使われてしまう危険があるため空白と改行のみで良いと判断いたしました。 ※文字がひらがなか、カタカナか、漢字か、英数字か調べる https://dobon.net/vb/dotnet/string/ishiragana.html#islatin ※Unicode 表 https://www.fileformat.info/info/unicode/category/Ll/list.htm 現在のコードのように空白と改行のみ制限する方法と別にコメント承認後に表示させる方法の2つとも用意しておきたいのですが、コメントを承認制にするコードを調べても中々ヒットせず1つだけ方法を見つけることが出来ました。 その方法になるのですが、コメント送信後にコメントIDを発行して、apacheというサーバーソフトに保存(公開後のURLにアクセスしてもエラーページが返ってきて、内容が確認できない)コメントを承認後に表示するというものになります。 この方法以外アイデアが思いつかなかったのですが、wordpressの管理画面からコメントを一括で承認制にする方法も使えるかもしれません… dell_ok さんが思いつく方法などありますでしょうか?apache を使う方法は難しいのではないかと懸念しております。 ※Apache を使いコメントを承認制にする https://qiita.com/mimuro_syunya/items/72a4f943c9b3bc88365c ※WordPress の管理画面からコメントを承認制にする https://www.javadrive.jp/wordpress/comment/index3.html

php_learn
質問者

補足

Q.NGワードを bbs_quest_input() 内で定義しても Chk_ngword() 内では使えません。 Chk_ngword() に定義した方がいいと思います。 A.アドバイスありがとうございます。変更いたしました。 ※最新コード https://wandbox.org/permlink/8TyzyqKegiYcOH2Q Q.そんなの考えたらきりがない、って思うようでしたら、記号については対応しなくていいような気もします。 それ言ったら、スペースや句読点は?ってことになって、それも対応しないとか。 どうどうめぐりになるので、質問者さまがどうしたいか、です。 A.アドバイスありがとうございます。ライブドアのまとめサイトなどを見ると大半がその文字で限定して禁止にしている気がします。 死という文字を禁止にした場合しとひらがなで書き込むひとがいるかもしれません。その場合は書き込みを削除するか、両方禁止にする対処法が必要かもしれません。 ※参考サイト https://qiita.com/hose/items/774ac58f0155ef0a9973 Q.そのきりのない対応をするよりも、本気で対応するのであれば、投稿直後に公開するのをやめて、管理者がチェックしてから、公開するか否か決める、と言う人手を使うのが理想だと思っています。 その方が、より確実に荒らし行為や非道徳発言に対応できるからです。 A.回答ありがとうございます、そういう方法も有効そうですね。両方の機能で考えてみます。 Q.管理者がそこまでできないのであれば、閲覧者が通報した時点ですぐに非表示にする機能を追加してしまうかです。 A.アドバイスありがとうございます。通報がない場合野放しになってしまう気がしており、NGワードの設定か管理者がチェックしてから、公開するか否か決める方法の両方で考えてみます。 Q.参考サイト➁では特に難しいコードがなくそちらを参考にしているのですが、英語に対応する場合に小文字大文字関係なくNGワードとして機能するのか心配です… https://www.php.net/manual/ja/function.mb-stripos.php mb_stripos — 大文字小文字を区別せず、 文字列の中で指定した文字列が最初に現れる位置を探す と書かれているので、大丈夫ではないでしょうか。 A.アドバイスありがとうございます、大丈夫そうですね。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.6

・全角スペースも半角スペースとして扱うので両方の意味を持つということでしょうか? よく見てください。 0と]の間に目に見えない全角スペースを記述しています。 ・Microsoft系のOSでは、\r\nが使われるようですね。 それはどのような状況で改行するかによって違うのではないかと思われます。 私の手元にある最近のMacOSで、SafariやChromeのWebブラウザで、textareaで改行したものを送信すると \r\n になっていました。 他で言うと、テキストエディタでは設定できたりもするので、一概には言えないと思います。 ・全角スペースが残るとはどういうことになるのでしょうか? 例えば、このように入力した場合の話しでした。 「あいうえお」の前に全角スペースがあります。 ~~~~     あいうえお ~~~~ でも、関係ありませんでした。 もともとやられていたコードに戻したらいいだけでした。 以下のように変更してください。 ----変更前 // 連続する空白をひとつにする $str = preg_replace('/[\x20\xC2\xA0 ]++/u', "\x20", $str); // 連続する改行をひとつにする $str = preg_replace("/(\x20*[\r\n]\x20*)++/", "\n", $str); // 前後の空白を除去 $str = mb_ereg_replace('^( ){0,}', '', $str); $str = mb_ereg_replace('( ){0,}$', '', $str); $str = trim($str); ----変更後 // 連続する空白をひとつにする $str = preg_replace('/[\x20\xC2\xA0]++/u', "\x20", $str); // 連続する改行をひとつにする $str = preg_replace("/(\x20*[\r\n]\x20*)++/", "\n", $str); // 前後の空白を除去 $str = mb_ereg_replace('^( ){0,}', '', $str); $str = mb_ereg_replace('( ){0,}$', '', $str); $str = trim($str); ---- ・回答No.3の補足追加コードで対応することは可能でしょうか? 正しく動作するようにすれば、可能です。 ぱっと見る限り、この部分を直す必要があります。 ---- if ('' == $str) { ----

php_learn
質問者

補足

Q.よく見てください。 0と]の間に目に見えない全角スペースを記述しています。 A.回答ありがとうございます、理解出来ました。 全角スペース分あけているから(半角スペース)か全角スペースのいずれかという意味になるんですね。 Q.それはどのような状況で改行するかによって違うのではないかと思われます。 他で言うと、テキストエディタでは設定できたりもするので、一概には言えないと思います。 A.アドバイスありがとうございます。 Q.例えば、このように入力した場合の話しでした。 「あいうえお」の前に全角スペースがあります。 ~~~~     あいうえお ~~~~ A.回答ありがとうございます、理解出来ました。 Q.正しく動作するようにすれば、可能です。 ぱっと見る限り、この部分を直す必要があります。 ---- if ('' == $str) { ---- A.回答ありがとうございます、修正してみたのですが参考サイト➀を見ると下記のような機能がついており、途中句読点が入っているものは対策が必要なのでしょうか? 正規表現でもスペースに対応しているためどのように変更すればいいのか分からず悩んでおります… 参考サイト➁では特に難しいコードがなくそちらを参考にしているのですが、英語に対応する場合に小文字大文字関係なくNGワードとして機能するのか心配です… functions.php の52行目のコードを修正いたしました。未入力の際にエラー表示する場合 $str をチェックしているということを dell_ok さんから教えて頂いたので、そちらを参考にしております。 // 小文字化 $str = mb_strtolower($str, ’UTF-8’); // 半角英数字全角カタカナへ置換 $str = mb_convert_kana($str, ’KVas’, ’UTF-8’); // スペース、句読点などを削除 $target_sentence = preg_replace(’/\s|、|。/’, ’’, $str); ※参考サイト➀ https://php.o0o0.jp/article/php-ng_words ※参考サイト➁ https://teratail.com/questions/337438 ※最新コード https://wandbox.org/permlink/wxlC8BSHbPbRpOlg

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.5

・正規表現について考えている中で NG ワードを設定して都度書き込めないようにする機能を考えておりました。そちらで対応できますでしょうか? 見当も付きませんが、正規表現だけでは無理か難しいと思います。 ・回答No.1では全角スペースを半角スペースに変更して対応いるようですが、このままで全角スペースを取り除かない方向で実装したいと考えております。 そうですか。 それはかまいませんが、前後の空白を削除するtrim()では全角スペースが残ります。 ・禁止ワード対策についてコードを考えてみたのですが、参考サイトのように breakやFALSE で処理を停止する必要はないのでしょうか? 考えられたコードを正しく動作するようにすれば停止しますよ。 $error[]にエラーメッセージが設定されれば、画面は進みませんので。

php_learn
質問者

補足

Q.正規表現について考えている中で NG ワードを設定して都度書き込めないようにする機能を考えておりました。そちらで対応できますでしょうか? A.回答ありがとうございます。制御文字(\\x0-\x1F と \x7F)を追加する代わりに回答No.3の補足追加コードで対応することは可能でしょうか? Q.それはかまいませんが、前後の空白を削除するtrim()では全角スペースが残ります。 A.回答ありがとうございます。 申し訳ありません理解ができていない部分があるのですが、全角スペースが残るとはどういうことになるのでしょうか? Q.考えられたコードを正しく動作するようにすれば停止しますよ。 $error[]にエラーメッセージが設定されれば、画面は進みませんので。 A.回答ありがとうございます。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.4

・/[\x20 ]は半角のいずれか1文字という意味でしょうか? 「\x20(半角スペース)か全角スペースのいずれか」と言う意味です。 1文字と言う意味まではないと思いますが、1文字に違いありません。 前の / は正規表現を記述する規則による記号なので関係ありません。 ・(\x20*[\r\n]\x20*)の意味が理解できないのですが、*[\r\n]この部分はどういう意味があるのでしょうか? * はその前にある \x20 に付いているもので「\x20*」でひとまとまりです。 後ろにも同じ「\x20*」があります。 これらは「半角スペースがゼロ個以上」と言う意味です。 [\r\n] は改行コードを示すもので、「\rか\nのいずれか」と言う意味です。 この組み合わせは、以前言われていた「改行可能にしたほうが見やすい場合も考えられるのですが、改行を複数行許してしまうと荒し行為」に対応したものです。 「改行は許すけど、連続させない」が目的です。 単純に改行を複数連続で入力されると仮定するなら [\r\n] だけで構いません。 ですが、荒らし目的の人はそんな単純な入力なんて平気でこえてくると思います。 質問者さまが言われている荒らし的な改行がどのようなものか示されていないので私が勝手に想像したものですが、単純な改行とはこのようなものです。 ~~~~ あいうえお 改行 改行 改行  (かなり続くので省略) 改行 改行 改行 かきくけこ ~~~~ これを [\r\n] だけで対応すると、このように変換されますので荒らし対策はできているかと思います。 ~~~~ あいうえお かきくけこ ~~~~ 次に、単純でない改行はこうです。 ~~~~ あいうえお 半角スペース改行 半角スペース改行 半角スペース改行  (かなり続くので省略) 半角スペース改行 半角スペース改行 半角スペース改行 かきくけこ ~~~~ これは [\r\n] だけで対応すると、何も変わらすそのままになります。 改行だけが連続しているのではないからです。 半角スペースは目に見えないので、見た目は連続しただけの改行ですが、これは荒らしに成功したと言えるのではないでしょうか。 改行の前後に半角スペースがあるものも含めて、こうなるようにしたものがあの記述です。 ~~~~ あいうえお かきくけこ ~~~~ とは言え、どの文字でも構いませんが、例えば「1」と言う文字と改行を連続して入力されたら対応できません。 こんな荒らし方もあるのではないでしょうか。 ~~~~ あいうえお 1改行 1改行 1改行  (かなり続くので省略) 1改行 1改行 1改行 かきくけこ ~~~~ あくまで、見た目が改行だけのようなものに対応したことにしかなりません。 これを許してしまうのであれば、いっそのこと [\r\n] だけでもいいのかも知れません。 ・Unicode 文字プロパティを使う必要はないでしょうか? 使う必要はありませんでした。 使い方も熟知できないので敬遠したのもあります。 参考サイトにあった、そのプロパティを使った方法 [\p{Cc}\p{Cf}\p{Z}] ですと改行も消えてしまいました。 改行をどうするかを質問者さまに決めていただかないと、私からのアプローチができません。 他の方のアドバイスの『「2個連続」で改行や空白で引っかかってしまう。』と言うは、上記の「(\x20*[\r\n]\x20*)」がそれに対応したものでもあります。 「空白系文字は、全角空白以外にも、タブ ( \t )とかフォームフィード( \f )などもあります。」 これは、それぞれ追加すればいいと思います。 それよりも、見えない文字すべてに対応してくれる \s を使うのが簡単なのかもしれません。 参考サイトにも書かれていた方法です。 ですが、これは改行も消えてしまったので、使いませんでした。 いずれにしても、私が改行荒らしの意味がわかっていないのと、空白を消したかった理由やサンプルがないのと、質問者さまが改行をどうするか決められないと、これらの進め方が決まりません。

php_learn
質問者

補足

Q.「\x20(半角スペース)か全角スペースのいずれか」と言う意味です。 A.回答ありがとうございます。調べた際に半角スペースと出てきたのですが、全角スペースも半角スペースとして扱うので両方の意味を持つということでしょうか? Q.* はその前にある \x20 に付いているもので「\x20*」でひとまとまりです。 これらは「半角スペースがゼロ個以上」と言う意味です。 A.回答ありがとうございます。理解できました。 Q.[\r\n] は改行コードを示すもので、「\rか\nのいずれか」と言う意味です。 「改行は許すけど、連続させない」が目的です。 A.回答ありがとうございます。調べてみたのですが、Microsoft系のOSでは、\r\nが使われるようですね。 ※参考サイト https://ja.stackoverflow.com/questions/12897/%E6%94%B9%E8%A1%8C%E3%81%AE-n%E3%81%A8-r-n%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B Q.例えば「1」と言う文字と改行を連続して入力されたら対応できません。 こんな荒らし方もあるのではないでしょうか。 ~~~~ あいうえお 1改行 1改行 1改行  (かなり続くので省略) 1改行 1改行 1改行 かきくけこ ~~~~ A.アドバイスありがとうございます。 上記の荒らしは気になるのですが、全文を表示させず折り畳み表示させる方法やヤフー知恵袋のように改行も空白も文字数にカウントすることで対策になるのではないかと考えております。 Q.Unicode 文字プロパティを使う必要はないでしょうか? 使う必要はありませんでした。 使い方も熟知できないので敬遠したのもあります。 A.回答ありがとうございます、難しく理解できず参考サイトを探したのですが1つしか見つけられなかったので使うべきではなさそうですね。 ※参考サイト https://techracho.bpsinc.jp/hachi8833/2013_09_27/13713 Q.「空白系文字は、全角空白以外にも、タブ ( \t )とかフォームフィード( \f )などもあります。」 これは、それぞれ追加すればいいと思います。 A.アドバイスありがとうございます。改行は可能な限り残しておきたいので、空白系文字を追加する方法で実装を考えていきたいです。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.3

参考サイトの NO-BREAK SPACE(U+00A0) にも対応した方がよさそうでした。 一般的な日本語WIndowsOSでは入力できない文字のようなのですが、MacOSでは簡単に入力できて確認できたので追加しました。 ---- // 連続する空白をひとつにする $str = preg_replace('/[\x20\xC2\xA0 ]++/u', "\x20", $str); ---- 参考サイトでは 制御文字(\\x0-\x1F と \x7F) に対応しているみたいですが、確認方法がわからないので対応していません。 必要だと思われるのでしたらならって追加しておいてください。 なお、回答No.1でも書きましたが、全角スペースは \xE3\x80\x80 では対応できなかったため全角スペースをそのまま記述しています。 こちらも追加しておいてもいいとは思いますが、全角スペースはなくさない方がいいと思います。

php_learn
質問者

補足

Q.参考サイトの NO-BREAK SPACE(U+00A0) にも対応した方がよさそうでした。 一般的な日本語WIndowsOSでは入力できない文字のようなのですが、MacOSでは簡単に入力できて確認できたので追加しました。 参考サイトでは 制御文字(\\x0-\x1F と \x7F) に対応しているみたいですが、確認方法がわからないので対応していません。 必要だと思われるのでしたらならって追加しておいてください。 なお、回答No.1でも書きましたが、全角スペースは \xE3\x80\x80 では対応できなかったため全角スペースをそのまま記述しています。 こちらも追加しておいてもいいとは思いますが、全角スペースはなくさない方がいいと思います。 A.アドバイスありがとうございます。dell_ok さんのおっしゃる通りUTF-8の半角スペースが?に変換される事象があるようですね。 ※参考サイト https://choice-site.com/2016/07/22/utf-8%E3%81%AE%E5%8D%8A%E8%A7%92%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AB%E6%82%A9%E3%81%BE%E3%81%95%E3%82%8C%E3%82%8B/ 制御文字は PHP の仮想エディターで確認できるようですね。ヤフー知恵袋の回答通りバリデーションにはならない気がしております。 正規表現について考えている中で NG ワードを設定して都度書き込めないようにする機能を考えておりました。そちらで対応できますでしょうか? 回答No.1では全角スペースを半角スペースに変更して対応いるようですが、このままで全角スペースを取り除かない方向で実装したいと考えております。 ※PHPの制御文字チェックに関して https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13153843083?fr=sc_scdd&__ysp=5Yi25b6h5paH5a2XKFxceDAtXHgxRiDjgaggXHg3Rik%3D __________________________________ 禁止ワード対策についてコードを考えてみたのですが、参考サイトのように breakやFALSE で処理を停止する必要はないのでしょうか? sin_functions.php の15行目にコードを追加いたしました。 // NGワードリスト配列の定義 $ng_words = array('死ね','アホ','殺す','バカ'); sin_functions.php の19行目にコードを追加いたしました。 Chk_ngword($namae, '・NGワードが入力されています。', $error); Chk_ngword($message, '・NGワードが入力されています。', $error); sin_functions.php の52行目にコードを追加いたしました。 function Chk_ngword($str, $mes, $error) { foreach ($ng_words as $ngWordsVal) { if ('' == $str) { $error[] = $mes; } } } ※最新コード https://wandbox.org/permlink/BvVIMj07xRclmV48 ※NGワードをはじく https://teratail.com/questions/337438 ※禁止ワード対策 https://php.o0o0.jp/article/php-ng_words

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

全角スペースは半角スペースに置換するようにしています。 理由は、全角スペースと半角スペースを交互に入力された場合には連続していないことになるので、見えない長い長い空白を許可してしまうためです。 全角スペースは半角スペースと同じとみなして連続していることにしてひとつの半角スペースにすることで回避しています。

php_learn
質問者

補足

修正ありがとうございます。