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

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

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

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

Q&A

解決済

2回答

7216閲覧

preg_match()関数で円マークがマッチしない

CodeLab

総合スコア1939

PHP

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

0グッド

0クリップ

投稿2018/12/12 08:14

preg_match()関数で円マークがうまくマッチしません。

たとえば¥150,000 (バックスラッシュで表記されてしまうのであえて全角で書いてますが、すべて半角)を 150000 という数字だけに変換したいということで、先頭が円マークかどうかで判断して変換が必要かどうかを調べるため、以下のように書きました。

PHP

1 $str = "\150,000"; 2 if(preg_match('/^\/',$str)){ 3 var_dump("マッチした"); 4 }

これ自体はうまく動作します。
ですがが、外部から持ってきた文字列だとマッチしませんでした。

試したこと

正規表現を/^\/ とか /^/u とか /^¥/uなど試してみましたがいずれもだめでした。

ためしにbin2hex()で16進数に変換して、文字コードを出してみたところ

プログラム書いたほう
string(8) "\150,000"
string(16) "5c3135302c303030"

外部からの読み込み
string(9) "\150,000"
string(18) "c2a53135302c303030"

円マークの部分は 5c かと思われますが、外部からの読み込みでは c2a53 になっており、表示上は同じですが、コードが違うようです。
UTF8のコード表を見るとどちらも円マークを意味するもののようなのですが…。

マッチさせるにはどうしたらよいでしょうか?

環境

PHP 7.1.8 (cli) (built: Aug 2 2017 14:25:25) ( NTS )
文字コードはすべてutf-8

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

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

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

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

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

m.ts10806

2018/12/12 08:19

実際に読まれる文字列は同じものですか?その「外部から持ってきた」はどのように持ってこられるのでしょうか
guest

回答2

0

ベストアンサー

両方ヒットさせるしかないでしょう。

php

1 if(preg_match('/^[\¥]/u',$str)){

投稿2018/12/12 08:19

maisumakun

総合スコア145930

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

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

CodeLab

2018/12/12 08:21

意図通りに動くようになりました。 ありがとうございました!
guest

0

結局のところ、これでできた

PHP

1if(preg_match('/^¥/u',$str)){

バックスラッシュ=円マークだと思い込んでいたが、そう単純ではなかったようでした。
実際ASCIIコードだとバックスラッシュ=円マークだが、UTF-8だと、バックスラッシュのコードとは別の文字で円マーク(c2a5)がある。

変数をダンプした文字列をコンソールの画面からコピペ持ってきたら、なぜか5cの方の円マークに変わってしまったため混乱していました。

PHP

1var_dump(bin2hex("\")); //バックスラッシュ 2var_dump(bin2hex("¥")); //utf-8の半角円 3var_dump(bin2hex("¥")); //utf-8の全角の円

表示結果

string(2) "5c" string(4) "c2a5" string(6) "efbfa5"

ということで、何が来ても大丈夫なようにするには

PHP

1 if(preg_match('/^[\\¥¥]/u',$str)){

とするのが正解のように思います。

投稿2018/12/12 08:41

CodeLab

総合スコア1939

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問