アプリ版:「スタンプのみでお礼する」機能のリリースについて

9月18日(火)7時55分を配列へ格納したいです。

■1
$data = preg_split("/月|日|\(.\)|時|分/",$data);
とやると、うまく区分けされないところがあります。
Array
(
 [0] => 9
 [1] => 18
 [2] => (火)7
 [3] => 55
)

■2
preg_split("/月|日|\(*\)|時|分/",$data);とやると、
曜日のところが変な感じになります
Array
(
 [0] => 9
 [1] => 18
 [2] => (火
 [3] => 7
 [4] => 55
)

■3
preg_split("/月|日|\(.*\)|時|分/",$data);
もしくは、
preg_split("/月|日|\(.*?\)|時|分/",$data);
とやると、曜日が取得できません
Array
(
  [0] => 9
  [1] => 18
  [2] =>
  [3] => 7
  [4] => 55
)

■質問
・きれいに区切るには、どう書けば良いでしょうか?
・後、正規表現も勉強したいので、それぞれなんで駄目なのか教えてください

A 回答 (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
)
    • good
    • 0
この回答へのお礼

「回答&詳細な解説」ありがとうございました。

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

お礼日時:2012/09/19 10:51

"日"の直後に"("が必ず存在するなら



<?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);

として空白を詰める方が好みですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/09/19 10:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!