• ベストアンサー

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 へ代入する。 ……誰か教えてください…。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>どこら辺に問題ありそうでしょうか? まずpreg_matchで$regsを生成していますが、マッチしないケース すなわち「数字からはじまる文字列」の場合、$regsが未設定になります。 したがって$regs[2] === ''で評価すると$regsが未設定エラーになります。 またエラーレベルを下げた場合でも、$regs[2] === ''はfalseなので 数字ではない文字列をintvalで評価するため$変数2には0が代入されます。 やはりif分岐である程度場合分けをしっかりしてやらないといけないでしょう。 総じて$変数1に代入される文字列の想定を広げて、チェックしてやる必要があります。 また、仮にデータがきちんと通ったとして、$変数2は空文字か数字という データ型が確定しないフローになっています たしかにPHPは変数定義がいい加減ではありますが、あまりなんでも かんでも入れればいいというものではありませんので、ある程度 変数の型が一律になるような工夫が必要だとおもいます。

re999
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

▽1行目 パターン '/^(\D+)(\d*)$/'に $変数1 がマッチした内容を $regsに代入しています。 ただし、マッチしない場合は2行目の処理にうつります。 ▽2行目 変数1の内容をタグをエスケープして表示します。 ▽3行目 $reg[2]すなわち$変数の最初にあらわれる数字群をしらべ、 それがない場合は、$変数2に空文字を、そうでない場合は $変数2に文字を整数にキャストして代入します。 データチェック、フロー、データの持ち方にやや問題があるソースですね

re999
質問者

補足

回答ありがとうございます。 その後、自分でも調べていたのですが、大体こんな感じで合ってるでしょうか? 変数1が、 「先頭が非数字」または、「先頭が非数字でかつ最後が数字」以外のものだった場合には、変数1の内容をタグをエスケープして表示。但し、警告を表示するだけなので、いずれにせよ、回答いただいた内容の、3行目の処理は続行される。 >データチェック、フロー、データの持ち方にやや問題があるソースですね どこら辺に問題ありそうでしょうか? ご参考までにざっくりとでも教えていただけると、勉強になるのですが…。そもそも、何をやりたいのかはっきりしていない状況では、答えづらいかとは思いますが…

すると、全ての回答が全文表示されます。

関連するQ&A