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

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

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

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

Q&A

解決済

2回答

1192閲覧

phpで特殊文字にマッチしない文字を通したい

Chandler_Bing

総合スコア673

PHP

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

0グッド

0クリップ

投稿2019/06/11 05:01

編集2019/06/11 08:52

表題の通りですが表題を実現できずに困っております。

php

1<?php 2$str = '-._~%:/?#[]@!$&\'()*+,;='; 3$str = preg_quote( $str , '/'); 4$str = "[^" . $str . "]"; 5echo $str; 6 7$value = "@"; 8//$value = "@$$$$"; 9//$value = "++++;"; 10//$value = ":::"; 11 12 if (preg_match($str,$value) == 1) { 13 echo "不正な文字です"; 14 }else{ 15 echo "有効な文字です"; 16 } 17 18?>

$valueが全て有効な文字になってしまいます。どこがおかしいでしょうか。
ご教授お願いします。

先ほど以下のコードで上手くいって今したが、

php

1$str = '-._~%:/?#[]@!$&\'()*+,;='; 2$str = preg_quote( $str , '/'); 3$str = "/\A[" . $str . "]\Z/"; 4 if (preg_match($str,$value) == 1) { 5 echo "有効な文字です"; 6 }else{ 7 echo "不正な文字です"; 8 } 9

またすべての文字で不正な文字となります。なぜでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

preg_matchに与えるパターン文字列では、/abc/のように、両端に同じ記号を入れるデリミッタが必要です。

$str = "/[^" . $str . "]/";のように、両端にデリミッタを入れてください(preg_quoteに合わせて/としています)。

投稿2019/06/11 05:16

編集2019/06/11 05:17
maisumakun

総合スコア145121

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

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

maisumakun

2019/06/11 05:18

あと、[^...]は囲まれた文字「以外」を意味します。あるかどうかチェックする場合は^なしで[...]のほうが適当です。
Chandler_Bing

2019/06/11 05:21

ありがとうございます。結果は同じです。 ちなみにデリミッタは「{}」でも試しましたが同じです。 また $str2 = "^[^  ]$"; の半角、全角を以外のものでも半角、全角でも通ってしまいます。
Chandler_Bing

2019/06/11 05:33

$str = '-._~%:/?#[]@!$&\'()*+,;='; $str = preg_quote( $str , '/'); $str = "/[^" . $str . "]/"; $str2 = "/[^  ]/"; で」不正の場合に1を返すようにできました。今回はどうしても不正の時に正しくしたかったので。 しかし、$str,$str2とも先頭文字と、末尾を表す文字をいれると正常に判断しなくなります。 $str = "/[^" . $str . "]/"; を $str = "/^[^" . $str . "]$/"; に変えると全て通してしまいます。
maisumakun

2019/06/11 05:35

> 末尾を表す文字をいれると正常に判断しなくなります。 そう書くと、「該当の文字1文字か」という意味になります。2文字以上であれば何であっても一致しません。
Chandler_Bing

2019/06/11 05:41

$str = "/\A[^" . $str . "]\Z/"; echo $str; $str2 = "/\A[^  ]+\Z/"; で上手くいきました。ありがとうございます。
Chandler_Bing

2019/06/12 03:20

またエラーになっていましたが、\Aと\Zを外したらうまくいきました。
guest

0

列挙した記号が1文字でもあれば、「不正な文字です」にしたいのであれば、^を取る。

PHP

1$str = '-._~%:/?#[]@!$&\'()*+,;='; 2$str = preg_quote( $str , '/'); 3$str = "/[" . $str . "]/";

投稿2019/06/11 05:29

otn

総合スコア84423

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問