• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:preg_splitがうまくいかないので、教えてく)

preg_splitで文字列を区切る方法についての質問

このQ&Aのポイント
  • preg_splitを使用して文字列を区切る方法について質問があります。現在、特定の文字列を使用して配列への分割を試みていますが、うまくいきません。
  • 具体的には、月・日・曜日・時・分を区切り文字として使用し、文字列を分割したいです。しかし、いくつかのパターンでうまく区切ることができません。
  • 質問には具体的なコードの例も記載されており、それぞれのパターンでの問題点が説明されています。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

>正規表現も勉強したいので、それぞれなんで駄目なのか教えてください そもそも曜日も取り出したいのですか?そうすると出発点である /月|日|\(.\)|時|分/ から間違ってます。これだと曜日も消したいと言うことになってます。 ■1 なおこれが、曜日も消えていないのは、「火」が1バイトじゃないので 「.」 にマッチしないから。今時の普通の言語だと日本語のようなマルチバイト文字に対応していますが、PHPは普通の言語じゃないので専用の関数を使わないとマルチバイト文字をうまく使えません。preg_関数だと「.」は1文字じゃなくて1バイトにマッチします。 ■2 「\(*\)」 は、「左括弧がゼロ個以上の後に右括弧」にマッチします。 この場合だと 「)」 が該当しますね。 ■3 「\(.*?\)」 は、「左括弧の後に何バイトかあってその後に右括弧」ですね。 この場合だと 「(火)」にマッチするのでそれが区切り文字となって削除されます。 曜日も取り出したいのであれば、区切りに ( や ) を含める。 print_r(preg_split("/月|日|\(|\)|時|分/", $data)); ↓ Array ( [0] => 9 [1] => 18 [2] => [3] => 火 [4] => 7 [5] => 55 [6] => ) これだと途中に空が混ざるので、これを削除するには、 案1.( )+ で、連続する区切り文字をひとまとめにする print_r(preg_split("/(月|日|\(|\)|時|分)+/", $data)); ↓ Array ( [0] => 9 [1] => 18 [2] => 火 [3] => 7 [4] => 55 [5] => ) 末尾の空はしょうがない。 案2.第4引数で、空の結果を省くことを指定する。 print_r(preg_split("/月|日|\(|\)|時|分/", $data,-1,PREG_SPLIT_NO_EMPTY)); ↓ Array ( [0] => 9 [1] => 18 [2] => 火 [3] => 7 [4] => 55 )

re999
質問者

お礼

「回答&詳細な解説」ありがとうございました。 >そもそも曜日も取り出したいのですか?そうすると出発点である /月|日|\(.\)|時|分/ から間違ってます。 ご指摘ありがとうございます。前提から違ってたようで、失礼しました。 アドバイスを元に色々勉強していきたいと思いますー

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

その他の回答 (1)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

"日"の直後に"("が必ず存在するなら <?php $str = '9月18日(火)7時55分'; $arr = preg_split("/月|日\(|\)|時|分/", $str); print_r($arr); になると思います。でも個人的には $str = '9月18日(火)7時55分'; $arr = array(); foreach (preg_split("/月|日|\(|\)|時|分/", $str) as $val) { if ($val !== '') { $arr[] = $val; } } print_r($arr); として空白を詰める方が好みですね。

re999
質問者

お礼

回答ありがとうございました。 これから内容理解していきたいと思いますー

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

関連するQ&A