みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

preg_match( '/^(\D+)(\d*)$/' , $変数 , $regs )

if( ! preg_match( '/^(\D+)(\d*)$/' , $変数1 , $regs ) )
{echo ( 'invalid dirname: ' . htmlspecialchars( $変数1 ) );}
$変数2 = $regs[2] === '' ? '' : intval( $regs[2] ) ;

正規表現だと思うのですが、どういう意味か教えてください。

□分からないなりに考えてみました…
▽1行目
$変数の内容が、'/^(\D+)(\d*)$/'にマッチしなければ、$regs へ代入。
▽2行目
マッチしていた場合は、htmlspecialchars関数を実行した後、'invalid dirname: '+その結果を表示する。
▽3行目
$regs配列変数の1番目を、何かして、$変数2 へ代入する。

……誰か教えてください…。

投稿日時 - 2010-04-14 10:17:42

QNo.5825004

暇なときに回答ください

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

>どこら辺に問題ありそうでしょうか?

まずpreg_matchで$regsを生成していますが、マッチしないケース
すなわち「数字からはじまる文字列」の場合、$regsが未設定になります。
したがって$regs[2] === ''で評価すると$regsが未設定エラーになります。
またエラーレベルを下げた場合でも、$regs[2] === ''はfalseなので
数字ではない文字列をintvalで評価するため$変数2には0が代入されます。

やはりif分岐である程度場合分けをしっかりしてやらないといけないでしょう。
総じて$変数1に代入される文字列の想定を広げて、チェックしてやる必要があります。

また、仮にデータがきちんと通ったとして、$変数2は空文字か数字という
データ型が確定しないフローになっています
たしかにPHPは変数定義がいい加減ではありますが、あまりなんでも
かんでも入れればいいというものではありませんので、ある程度
変数の型が一律になるような工夫が必要だとおもいます。

投稿日時 - 2010-04-14 12:19:48

お礼

丁寧に解説いただきまして、誠にありがとうございました。

投稿日時 - 2010-04-14 12:30:51

ANo.2

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

▽1行目
パターン '/^(\D+)(\d*)$/'に $変数1 がマッチした内容を $regsに代入しています。
ただし、マッチしない場合は2行目の処理にうつります。

▽2行目
変数1の内容をタグをエスケープして表示します。

▽3行目
$reg[2]すなわち$変数の最初にあらわれる数字群をしらべ、
それがない場合は、$変数2に空文字を、そうでない場合は
$変数2に文字を整数にキャストして代入します。

データチェック、フロー、データの持ち方にやや問題があるソースですね

投稿日時 - 2010-04-14 10:56:05

補足

回答ありがとうございます。

その後、自分でも調べていたのですが、大体こんな感じで合ってるでしょうか?
変数1が、
「先頭が非数字」または、「先頭が非数字でかつ最後が数字」以外のものだった場合には、変数1の内容をタグをエスケープして表示。但し、警告を表示するだけなので、いずれにせよ、回答いただいた内容の、3行目の処理は続行される。

>データチェック、フロー、データの持ち方にやや問題があるソースですね
どこら辺に問題ありそうでしょうか? ご参考までにざっくりとでも教えていただけると、勉強になるのですが…。そもそも、何をやりたいのかはっきりしていない状況では、答えづらいかとは思いますが…

投稿日時 - 2010-04-14 11:18:30

あなたにオススメの質問