[PHP-users 35481] Re: preg_match_allについて

shinichiro mori shinichiro.mori.1983 @ gmail.com
2011年 2月 3日 (木) 22:30:41 JST


森といいます。

> ところで、改行を全て削除してしまってからでも
> 同じアウトプットは可能でしょうか?
について考えてみました。

サブパターンでマッチさせたい文字列について、もう少し工夫できると思います。
item_no, priceA, priceB の3項目は数字のみ含まれるのでしたら、

  "/item_no:(\d+)商品名:(.*?)priceA:(\d+)priceB:(\d+)/"

のようにできるかと思います。

ただ、商品名はいろんな文字が含まれると思いますので、難しいですよね。
それで、商品名の (.*?) が期待している以上に広くマッチして

  [0] => Array
      (
        [0] => item_no:123456商品名:あいうえおpriceA:520item_no:112235商品名:かきくけこpriceA:380priceB:200
        [1] => 123456
        [2] => あいうえおpriceA:520item_no:112235商品名:かきくけこ
        [3] => 380
        [4] => 200
      )

となってしまいます。

もし、商品名には「:」が含まれないと分かっているなら、

  "/item_no:(\d+)商品名:([^:]+)priceA:(\d+)priceB:(\d+)/"

で期待通りにマッチすると思います。

※ 備考
今回の例では大丈夫ですが、
「改行を含めた状態に対して処理する」という方針をとった場合に、
「データの末尾に改行が無い」というデータがあると、

  "/item_no:([^\n]+)\n商品名:([^\n]+)\npriceA:([^\n]+)\npriceB:([^\n]+)\n/"

を使った場合には、最後のアイテムを取り損ねてしまう可能性があると思います。
最後の改行がマッチしないからです。
例では、「商品名:はひふへほ」のデータです。
なので、最初に改行を追加するといった処理がある方がいいのかもしれません。


PHP-users メーリングリストの案内