質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1367閲覧

正規表現と配列、特定の言葉を除く

kagaribisou

総合スコア17

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/04/03 07:38

前提・実現したいこと

ウェブページでコメントを受け取ります。その時に特定の言葉が含まれるなら、送信できないようにしたいです。禁止ワードを配列で記憶してそれらをコメントからはじきたいです。

発生している問題・エラーメッセージ

Warning: preg_match(): No ending delimiter '�' found in C:\xampp\htdocs\HP\common.php on line 155

該当のソースコード

php

function evilsenser($original_word){ $original_word = trim($original_word);//両端の空白を削除 $bat_words = array('/罵詈雑言/','/罵詈雑言2/'); for($i=0; $i<=count($bat_words); $i++){ if(preg_match($original_word,'$bat_words[$i]') !== false){ return 0; } } return 1; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

xamppで実行しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

すでに色々指摘入っていますが、マニュアル読んだほうが良いですよ。
preg_match

返り値

preg_match() は、pattern が指定した subject にマッチした場合に 1 を返します。 マッチしなかった場合は 0、エラーが発生した場合は FALSE を返します。

なので、!== falseは意図した動作をしません。

余談
正規表現使うなら

$bat_words = '/' . implode('|',$ng_words) . '/u';

とか、してやるときれいになる気がする。

追記
まとめてみた。

php

1<?php 2$ng_words = [ 3 'hoge', 4 'fuga', 5 'piyo?', 6 'hage/', 7 ]; 8 9 10function evilsenser(array $ng_words, string $original_word){ 11 // $ng_words = array_map('preg_quote', $ng_words);//指摘により追記 12 $ng_words = array_map(function($a){return preg_quote($a, '/');}, $ng_words);//指摘により再修正 13 $bad_words = '/' . implode('|',$ng_words) . '/u'; 14 return (preg_match($bad_words, $original_word) === 1); 15} 16 17$test_words = [ 18 'test', 19 'hoge', 20 'hogetest', 21 'testfuga', 22 'tepiyost', 23 'tepiyo?st', 24 'tehage/st', 25 ]; 26 27foreach ($test_words as $value) { 28 echo $value . ':'; 29 var_export(evilsenser($ng_words, $value)); 30 echo PHP_EOL; 31}

投稿2018/04/03 08:16

編集2018/04/06 06:09
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2018/04/03 18:45

preg_quote ついてれば完璧
退会済みユーザー

退会済みユーザー

2018/04/03 22:16

指摘、ありがとうございます。 やっぱり、コード晒してみるもんですね。 勉強になります。
kagaribisou

2018/04/04 12:46

分かりやすいコードも書いてくださりありがとうございます。 ご指摘の通り、これからはマニュアルも活用していきたいと思います。 上記のコードを参考に想定通りに動かすことができました。m(_ _)m
mpyw

2018/04/06 05:03 編集

preg_quote でデリミタ / の指定が必要です(重箱の隅ですいません
退会済みユーザー

退会済みユーザー

2018/04/06 06:11

いやぁ、お恥ずかしい^^; オレこそ、マニュアル読め!ですね。。。 修正しました!
guest

0

preg_matchの引数が違っていませんか?

preg_match関数は、
第1引数が、正規表現のパターン "/あxxx/" のように罵詈雑言の前後を/で囲ったもの。
第2引数が、対象文字列。
(参考 preg_match)

質問のコードでは、
第1引数に対象文字列、第2引数にパターンが指定されています。
対象文字列は、正規表現のパターンのように/で囲まれていませんから、”No ending delimiter”(終わりの文字が見つからない)というエラーが出たのだと思われます。

投稿2018/04/03 08:02

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2018/04/03 08:07

それもだった…!
guest

0

適切でない箇所が2つあります。

  1. '$bat_words[$i]'と書くと、「$bat_words[$i]という文字列」の意味になってしまいます。変数の中身を使いたいときは、引用符なしで$bat_words[$i]と書いてください。
  2. 使おうとする正規表現が/罵詈雑言/のようになっていますが、UTF-8指定をして/罵詈雑言/uのように指定しておきましょう。単純一致なら問題はないですが、角カッコや繰り返しで日本語文字がバイト単位で扱われて正常動作しなくなることがあります。

投稿2018/04/03 07:57

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kagaribisou

2018/04/04 12:47

ご指摘ありがとうございます。精進します。
guest

0

既に指摘が色々入っているのでプラス1のアドバイスを。

「ブラックリスト」という形で設定ファイルなどに持っておいたほうが良いように思います。
あまり処理部分に色々と情報を持たないほうがコードがすっきりしますし、
役割が明確になります。

※あと超細かいですが bat_wordsではなくて bad_wordsですね。

投稿2018/04/03 08:24

編集2018/04/03 08:25
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kagaribisou

2018/04/04 12:49

コードのスタイリッシュさも求めてみたいと思います。 スペルミスは恥ずかしいですね(汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問