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

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

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

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

Q&A

解決済

2回答

14690閲覧

php バリデーションにて使用不可文字を設定する。

amaguri

総合スコア227

PHP

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

0グッド

0クリップ

投稿2017/01/10 07:09

編集2017/01/10 08:29

半角、全角対応のファイル名を入力するフォームを作ったのですが

①Windowsでファイル名に使うことができない
『/、?、¥、:、*、|、<、>』の使用不可文字の使用禁止
②../などのパス指定のような並びを禁止

を行いたいのですが
その場合はどのようにバリデーションをかければ実現できますでしょうか?

追記
①を禁止したい場合
明確なコードでの回答がいただけなかったため記載させていただきました。

preg_match('/\{¥/:?<>|\}/',$フォームの変数){ エラー処理 }

でいいのでしょうか?
\の必要さがいまいちわかりません。

また別サイトに書き込まれていました

preg_match('@[¥/:?<>|]@',$変数)

ともありましたがこの@の意味はなんなのでしょうか?
この場合でも同じ結果になるのでしょうか?

②の場合は
なにかいいバリデーションありますでしょうか?

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

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

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

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

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

guest

回答2

0

バリデーションして結果をどうしたいか次第じゃないですか?
想定外の文字がでてきたときに

  • 処理をしない
  • 想定外の文字を取り除き処理をつづける

によってことなります。
前者であればpreg_matchなどでマッチした瞬間にエラーとすればいいし
後者であればstr_replaceなどで強制的に問題文字を取り除けばいいでしょう
(リプレース後の文字が既存のファイルと名前競合する可能性は視野にいれてください)

投稿2017/01/10 07:21

yambejp

総合スコア114572

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

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

amaguri

2017/01/10 07:38 編集

回答ありがとうございます! 想定している動きとしては 処理をしない で考えています。 preg_matchを使って一致させる条件を作るのがいいということですね! あるのかわからなかったのですが 使用禁止文字のバリデーションが既存にあるかもしれないとおもい質問させていただきました。
guest

0

ベストアンサー

UTF-8に変換したうえで、文字列長で比較する方法がありますね。
参考

php

1function check($s){ 2 return strlen($s) !== strlen(mb_convert_encoding(mb_convert_encoding($s,'SJIS','UTF-8'),'UTF-8','SJIS')); 3}

###正規表現によるチェック

php

1$test = 'a\\b'; 2//この正規表現では、「\,:,?,<,>,|」と「./」と「../」を検索します。 3//(あえてスラッシュは正規表現の検索対象としていません。) 4$a = preg_match('#[\\\:?<>|]|\.{1,2}/#', $test,$m);

###追記

php

1/** 2 * 機種依存文字チェック 3 * @param type $text 4 * @return boolean 5 */ 6function platform_dependent_characters_filter($text) { 7 8 mb_regex_encoding('UTF-8'); 9 //$pdcでチェックの対象とする文字を設定 10 $pdc = '⑩⑪⑫⑬⑭⑯⑰⑱⑲⑳'; 11 $pdc_array = Array(); 12 $pdc_text = str_replace(array("\r\n", "\n", "\r"), '', $text); 13 //チェック対象を配列化 14 while ($iLen = mb_strlen($pdc, 'UTF-8')) { 15 array_push($pdc_array, mb_substr($pdc, 0, 1, 'UTF-8')); 16 $pdc = mb_substr($pdc, 1, $iLen, 'UTF-8'); 17 } 18 19 //特殊文字が無いかどうかチェックする 20 foreach ($pdc_array as $value) { 21 if (preg_match("/(" . $value . ")/", $pdc_text)) { 22 return true; 23 } 24 } 25 return false; 26}

投稿2017/01/10 07:14

編集2017/01/10 09:17
motuo

総合スコア3027

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

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

amaguri

2017/01/10 07:38

なるほど UTF-8に変換して文字列長で判断する方法もあるのですね。 この場合ですが 使用禁止文字にしたい?や/などは UTF-8にした時に特殊な文字列長になるのでしょうか?
motuo

2017/01/10 07:59 編集

すいません。私がちゃんと質問文を読み切れていなかったですね。 私が提示したものは①や②等、windowsで使われている特殊文字のエスケープ方法でした。 なので、?や/などは上手く判定できないと思います。 なので特定の文字をチェックするロジックを追記してみました。
amaguri

2017/01/10 08:00

お返事ありがとうございます! 追記でいただいた回答は どのように処理されているのでしょうか?
motuo

2017/01/10 08:08

「どのように」の部分がちょっと分かりかねるので詳細に教えてもらえますか? コードを見てわからない箇所がある、という事でしょうか? 一応、コメントに書いてあるつもりなのですが、分からない箇所を教えてもらえると回答をしやすいです。
amaguri

2017/01/10 08:13

お返事ありがとうございます まず不明なのが $pdc = の所が⑩〜 並んでいますがこれは本来は見たい文字を入れてくださいということでしょうか?
motuo

2017/01/10 08:19

その通りです。上記の例ですと、引数の$textに"⑩⑪⑫⑬⑭⑯⑰⑱⑲⑳"いずれかの文字が入るとtrueを返す処理になっています。
amaguri

2017/01/10 08:23

ありがとうございます! 変換してから見るという方法もあるのですね! このコードではあくまで ?¥などの文字コードの禁止文字の検索で ../などの連続した動きを 禁止するというのはできないという認識でよろしいでしょうか? また 追記させていただきました preg_match()の件ですがもしお分かりでしたらご回答いただけると幸いです。
motuo

2017/01/10 08:56 編集

@はデリミタですね。正規表現の対象の前後を@で括っているようです。@を例えば#に置き換えても結果は同じです。 上記の正規表現は'¥/:?<>|'のいずれかが含まれていたらエラーにする、という意味でしょう。/単体でもバリデーションに引っかかりますね。 ./や../を正規表現ではじくなら、preg_match('#[¥\\\:?<>|]|\.{1,2}/#', $text) という書き方も出来ますね。 回答を編集しました。
amaguri

2017/01/10 09:02

なるほど! 区切りでしかないわけですね! なるほどありがとうございます! 試してみたいと思います!
amaguri

2017/01/10 09:10 編集

すみません ``` a = preg_match('#[\\\\:?<>|]|\.{1,2}/#', $test,$m); ``` とありますが \\\\と4つ続いているのはなぜでしょうか?
motuo

2017/01/10 09:16

\をエスケープしたいからです。\\ではエスケープになりません。「\」をエスケープするだけなら、\3つで良かったですね。手が滑ってました。(実害はありませんが、回答は修正しておきました。) 以下、http://php.net/manual/ja/language.types.string.phpより引用 ************************* バックスラッシュをリテラルとして指定するには、二重 (\\) にします。 それ以外の場面で登場するバックスラッシュは、すべてバックスラッシュそのものとして扱われます。 つまり、\r や \n といったおなじみのエスケープシーケンスを書いても特別な効果は得られず、 書いたままの形式で出力されます *************************
amaguri

2017/01/10 09:21

ご回答ありがとうございます! \及び¥は エスケープするというのは調べて分かったのですが 4つある場合の処理がわからずでした。 細くありがとうございます その場合は \n などを有効にしたい場合は \\\n と記載したら良いという認識であっていますでしょうか?
motuo

2017/01/10 09:31

正規表現の中では、\nのままで大丈夫です。 preg_match('#[:?<>|]|\.{1,2}/|\n#', $test,$m) これで改行コードを判定できますね。
amaguri

2017/01/10 10:20

なるほど!ありがとうございます! 試してみたところうまくいきました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問