![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
PHPのpreg_split第3引数で理解できない挙動になることがあるのですが…
第3引数
・区切り文字で分割できる数以上の数を指定した場合の挙動は、分割できる最大数で分割されるとは限らないのですか?
Q
下記の「b_0」「b_3」「b_4」は、それぞれどういう理由で下記結果となるのですか?
-------
前提
$str='zwed_fgrty_abcde_h';
-------
理解できる挙動例 a_6
$ra_6 = preg_split('/_/', $str, 6);
var_dump($ra_6);
array(4) {
__[0]=> string(4) "zwed"
__[1]=> string(5) "fgrty"
__[2]=> string(5) "abcde"
__[3]=> string(1) "h"
}
-------
理解できる挙動例 b_1
$b_1 = preg_split('/_[^_]+/', $str, 1);
var_dump($b_1);
array(1) {
__[0]=> string(18) "zwed_fgrty_abcde_h"
}
-------
理解できる挙動例 b_2
$b_2 = preg_split('/_[^_]+/', $str, 2);
var_dump($b_2);
array(2) {
__[0]=> string(4) "zwed"
__[1]=> string(8) "_abcde_h"
}
-------
理解できない挙動例 b_0
$b_0 = preg_split('/_[^_]+/', $str, 0);
var_dump($b_0);
array(4) {
__[0]=> string(4) "zwed"
__[1]=> string(0) ""
__[2]=> string(0) ""
__[3]=> string(0) ""
}
-------
理解できない挙動例 b_3
$b_3 = preg_split('/_[^_]+/', $str, 3);
var_dump($b_3);
array(3) {
__[0]=> string(4) "zwed"
__[1]=> string(0) ""
__[2]=> string(2) "_h"
}
-------
理解できない挙動例 b_4
$b_4 = preg_split('/_[^_]+/', $str, 4);
var_dump($b_4);
array(4) {
__[0]=> string(4) "zwed"
__[1]=> string(0) ""
__[2]=> string(0) ""
__[3]=> string(0) ""
}
No.1ベストアンサー
- 回答日時:
zwed_fgrty_abcde_h
b_0は、最初のセパレーター _fgrty 次のセパレーター _abcde 3つ目のセパレーター _h で、それぞれのセパレーターに挟まれたのは、
zwed と 空文字列 3つです
b_3は、3つに分割するのでセパレーターは2つまで使います。b_0との違いは _h がセパレーターに選ばれないので、挟まれたのは、
zwed 、空文字列、_h です
b_4は、b_0と同じ。
考え方としては、
『セパレーターにマッチするもののうち、先頭から「第3引数-1」個だけを使って、文字列を分割』
ということです。
回答ありがとうございました。
内容難しかったですが、分かったような気がします。
・セパレーターにマッチするもののうち、先頭から「第3引数-1」個までを使って、文字列を分割。※0は意味が異なるのでこれには該当しない
・セパレータの間がない場合は、空文字になる
ということだと理解しました
No.3
- 回答日時:
これが理解しにくいのは、
正規表現で定義されたセパレーターが
実際のセパレートの際にどんな文字列だったのか
表示されていないからですね。
以下のような感じだったら
秒で理解できたのでしょう。
説明が下手でした。
もっと勉強します。
コード:
<?php
$string='000_111_222_333_444_555_666_777_888_999';
$array=preg_split('/_[^_]+/',$string,5);
print_r($array);
?>
結果:
array of 1 : 000
separate1 : _111
array of 2 :
separate2 : _222
array of 3 :
separate3 : _333
array of 4 :
separate4 : _444
array of 5 : _555_666_777_888_999
再度の回答ありがとうございました。
>説明が下手でした
・とんでもないです
・わざわざコード作成いただきありがとうございます
>第3引数を1から順に増やしていくと分かりやすい
・「この文」を読んで、「単純なコード例を作成して一つ一つ順を追って地道に確認していくこと」がやはり重要なのだな、と改めて思いました
No.2
- 回答日時:
テスト用の文字列が短いからわかりにくいのだと思います。
Geeksforgeeks IDE
https://ide.geeksforgeeks.org/r9Z1bCW5tl
コード:
<?php
// Your code here!
$string='000_111_222_333_444_555_666_777_888_999';
$array=preg_split('/_[^_]+/',$string,5);
print_r($array);
?>
結果:
Array
(
[0] => 000
[1] =>
[2] =>
[3] =>
[4] => _555_666_777_888_999
)
第3引数を1から順に増やしていくと
分かりやすいので
試してみてください。
「回答」&「具体例作成」&「リンク提示」ありがとうございました。
>第3引数を1から順に増やしていくと分かりやすいので試してみてください
・試してみました
・質問時点では空文字になる意味が分からなかったのですが、No.1さんの回答を読んで「最初のセパレーター」「次のセパレーター」と、一つ一つ順を追って確認していき、リンク先コードを動かしていくと理解できました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- PHP ワードプレスサイト PHP8.0.25でのWarningエラー 1 2023/06/12 11:44
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPで画像の渡しが上手く行きま...
-
if(preg_match("/[^0-9]/",$gu_...
-
PHP MySQLに画像を直接保存
-
htmlspecialcharsが機能してい...
-
掲示板を作成しておりアップロ...
-
PHPSpreadsheetによる書き出し...
-
phpでこの記述をもっと簡単に書...
-
ランキングを表示する際の画像...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
phpに関わる所での、form actio...
-
ゆゆにゃ。
-
【初心者】XAMPPのapacheの(恐...
-
プログラミング言語で、使える...
-
こちらはただの直列処理ですか?
-
PHPでこのコード自体に意味は無...
-
PHPとHTML+Xamppの掲示板で画像...
-
phpでPEAR::DBを使っているので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プルダウンメニューにDBの内容...
-
phpとmysqlで「あいまい検索」...
-
PHP5の外部コマンド実行で、バ...
-
「ローマ字 -> ひらがな」へPHP...
-
Mysqlとphpでソートや更新時の...
-
PEAR・MDB2のモジュールロード...
-
HTTPのメッセージボディについ...
-
数学の「組み合わせ」を求める...
-
順位を付ける時のスコアの重複...
-
Zend_Form_Element_Hash
-
日付から順にデータを並び替えたい
-
占いのPHPを作成中ですが・・・
-
しりとり 無限ループ?
-
選択日と終了日を配列で取得したい
-
多次元配列のカウント+1の仕方
-
mysqlにinsertするとエラーがで...
-
$xml要素を階層指定して取得し...
-
サイト名を取得するPHP
-
要素(文字列)から指定値を検索
-
月一覧を取得するには?(20120...
おすすめ情報