カテゴリー

キーワード

 
> 【PHP】文字列を分割する関数...

【PHP】文字列を分割する関数preg_splitと正規表現の話を少し


2016 年 7 月 15 日 投稿    view: 2858
タグ:
このエントリーをはてなブックマークに追加

preg_split PHP

 

こんにちは、WEBマーケティング部の杉尾です。

 

今回はpreg_splitという文字列関数を紹介します。

 

preg_splitとは

preg_split は、正規表現で指定した文字列を分割してくれる関数です。

 

以前、紹介したexplodeも文字列を分割してくれる関数ですが、explodeは正規表現が使えません。(その分、早いのですが)

【PHP】explodeとimplodeで文字列と配列を変換

 

preg_splitは、若干遅くなるものの、区切り文字に正規表現が使えます。

 

 

と、言ってもわかりにくいでしょうから、次項から例をご覧いただきながら、解説を加えます。

 

例1 preg_splitの正規表現を使う

<?php
$str = preg_split('/[\s,]+/', 'kabushiki gaisya scenelive');
print_r($str);
// 実行結果:Array ( [0] => kabushiki [1] => gaisya [2] => scenelive )
?>

 

【解説】
二行目は、『' '(半角スペース)、\t、\n 、\r 、\f などの空白文字、またはカンマで句を分割する』という意味です。

 

 

以下、詳しく説明します。

 

preg_splitの後ろにある()内の、第一引数の最初と最後にある『 / 』はデリミタ(※1)です。

 

で、次の『 [ 』から『 ] 』の中で、関数が値を返す条件の範囲(文字クラス)を示します。(※2

この場合は『\s』と『,』を指定しています。

 

『\s』はメタ文字と言われ、『空白文字すべて(半角スペース、\t、\n 、\r 、\f)』を意味します。

また、『 ] 』の後ろにある『+』は『1回以上の連続する文字』を意味する量指定子※3)です。

 

ですから、第二引数に指定した『kabushiki gaisya scenelive』の空白とカンマが取り除かれます。

 

その結果が、四行目の実行結果(これは文頭の//でエスケープしているのでエラーになりません)のようになります。

 


 

※1 PCRE関数(Perlと互換性がある正規表現関数:preg_replaceやpreg_filter)を使う場合は、正規表現をデリミタ(delimiters:区切り記号)で囲わなくてはいけません。


デリミタには、英数字、バックスラッシュ、空白文字以外の任意の文字を使うことができます。
よく使われるのは、『スラッシュ (/)』『ハッシュ記号 (#)』『チルダ (~) 』です。

 

※2 たとえば、[a-z]と書いてあると、aからzまでの文字を意味します。[^a-z]だと、aからz以外の文字を意味します。(AからZまでの文字など)

 

※3 量指定子は、繰り返しを指定します。通常は{}の中に{2,4}などのように書きます。
この場合は、直前で指定した文字クラスが2個以上4個以下ある場合に、関数が値を返します。
二つ目の数を省略すると、繰り返しの上限が撤廃されます。(実際は65,536未満となる)

 

また、『+』は特殊な量指定子で、{1,}と同じ意味を持ちます。この場合は1個以上の連続する場合にマッチします。
つまり、[]内に示された文字クラスが1個あれば関数が値を返すということです。

 

例2 preg_splitで部分文字列を返させる

第三引数に数字を指定することもできます。

 

その場合、第二引数に指定した文字列を、最大で第三引数に指定した数字分の部分文字列にして返してくれます。

また、第二引数に指定した文字列が、第三引数に指定した数字より多い場合は、最後の部分文字列に含めて返されます。

 

日本語だとわかりづらいので、以下の例をご覧ください。

 

<?php
$str = 'scenelive';
$chars = preg_split('//', $str, 4, PREG_SPLIT_NO_EMPTY);
print_r($chars);
// 実行結果:Array ( [0] => s [1] => c [2] => e [3] => nelive )
?>

 

【解説】
二行目:『str』という変数に『scenelive』という文字列を代入しています。

 

三行目:デリミタ『//』内に指定した文字はありません。
変数『str』に入った『scenelive』という文字列を最大4つの部分文字列にして返すという指定です。
その結果を『chars』という変数に代入しています。
第四引数の『PREG_SPLIT_NO_EMPTY』に関しては、次項で説明します。

 

四行目:print_rで出力します。

 

五行目:実行結果(これは文頭の//でエスケープしているのでエラーになりません)です。

 

 

また、第三引数に『-1』『0』あるいは『NULL』を指定すると、『制限がない』ということになります。

 

例をご覧ください。

 

<?php
$str = 'scenelive';
$chars = preg_split('//', $str, NULL, PREG_SPLIT_NO_EMPTY);
print_r($chars);
// 実行結果:Array ( [0] => s [1] => c [2] => e [3] => n [4] => e [5] => l [6] => i [7] => v [8] => e ) 
?>

 

【解説】
三行目:第三引数に『NULL』を指定しています。ここは『0』や『-1』を指定しても結果は同じです。
五行目:実行結果(これは文頭の//でエスケープしているのでエラーになりません)です。

 

例3 preg_splitの第四引数

第四引数は3つあります。

 

PREG_SPLIT_NO_EMPTY

『PREG_SPLIT_NO_EMPTY』を指定すると、空文字列でないものだけが返されます。

具体例は前項をご覧ください。

 

PREG_SPLIT_DELIM_CAPTURE

『PREG_SPLIT_DELIM_CAPTURE』を設定すると、文字列分割用のパターン中のカッコ()によるサブパターンで指定された値も同時に返されます。

 

これもわかりづらいので、例をご覧ください。

 

<?php
$str = 'kabushiki-gaisya-scenelive';
$chars = preg_split('/(-)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($chars);
// 実行結果:Array ( [0] => kabushiki [1] => - [2] => gaisya [3] => - [4] => scenelive )
?>

 

【解説】
二行目:文字列の間を『-』でつないでいます。
三行目:『-』を()でくくって特殊文字として認識させ、第四引数に『PREG_SPLIT_DELIM_CAPTURE』を指定しています。
五行目:実行結果(これは文頭の//でエスケープしているのでエラーになりません)です。

 

PREG_SPLIT_OFFSET_CAPTURE

『PREG_SPLIT_OFFSET_CAPTURE』は、文字列をマッチするものとそのオフセット()に分割してくれるものです。

言葉にしてもわかりづらいと思いますので、例をどうぞ。

 

<?php
$str = 'kabushiki gaisya scenelive';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
// 実行結果:Array ( [0] => Array ( [0] => kabushiki [1] => 0 ) [1] => Array ( [0] => gaisya [1] => 10 ) [2] => Array ( [0] => scenelive [1] => 17 ) )
?>

 

【解説】
三行目:第四引数に『PREG_SPLIT_OFFSET_CAPTURE』を指定しています。

五行目:横に並べてしまうとわかりづらくなるのですが、これは返り値が配列になっています。

 

数字が返ってきていますが、これは第一引数に指定した空白の位置を示しています。

最初の『0』はkabushikiのところに空白がないからです。

次の『10』は、kabushikiとgaisyaの間の空白の位置を表しています。

最後の『17』に関しても同様です。

 

 

オフセットとは、位置を指し示すとき、基準となる位置からの差を表す値のことです。

 

 

 

まとめ

正規表現の説明を絡めながらでしたので、ややわかりづらかったかもしれません。

解説をそれなりに細かくしていますので、例を見ながら、色々と試行錯誤してみてください。

 

preg_splitやpreg_replace、preg_matchのような関数は、Perl互換のPCRE関数というのですが、正規表現を使おうとすると少しややこしくなります。

 

正規表現に関しては、プログラム初心者の方には複雑ですので、いずれ詳しく紹介したいと思います。

 

最後までご覧いただき、ありがとうございました。

 

 

【関連記事】

【PHP】explodeとimplodeで文字列と配列を変換

 

【PHP】PHP関数「substr」「mb_substr」の使い方を紹介します

 

【PHP】覚えておくと便利な文字列に関するPHP関数①

 

【PHP】覚えておくと便利な文字列に関するPHP関数②

 

 

 

杉尾成行 顔写真

この記事を書いた人

杉尾成行

株式会社SceneLive Webマーケティング部長

ウェブマーケティングコンサルタントとして、クライアントのウェブ集客をサポートしている。
また、ウェブ制作、システム制作にも携わり、数々のサイトを手掛けている。
当ホームページ、ブログシステムも制作。

前職:ライター、小説家

ウェブマーケティングコンサルタントとしてのブログ
ウェブ参謀

個人ブログ(オリジナル小説他) ⇒ 35deFA

 


カテゴリー

タグ
この記事が気に入りましたら、是非、他の方にもシェアしてください。
このエントリーをはてなブックマークに追加
関連記事