質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

882閲覧

preg_match_all関数をつかって文字列を抽出したい

agep31

総合スコア29

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/08/01 04:54

前提・実現したいこと

前日の質問内容と似ているのですが、以下の文字列に対してpreg_match_all関数を使って文字列を抽出したいです。
抽出パターンは「10文字」+「数字」+「日」です。
出力結果のような形にしたいのですが、手前の箇所しか取れていなく、困っています。

<文字列>
ヒルトン系列ホテルに泊まる1日目イタリア8日間

目的の出力結果

Array ( [0] => ン系列ホテルに泊まる1 [1] => 泊まる1日目イタリア8 )

現在の出力結果

Array ( [0] => ン系列ホテルに泊まる1 )

該当のソースコード

<?php $text = "ヒルトン系列ホテルに泊まる1日目イタリア8日間"; preg_match_all('/.{10}\d+?(?=日)/u', $text, $result); print_r($result);

試したこと

前回の質問では、「日」を1か所目の切り出しで使っているので、「日」を消費しない形で抽出し、後から加えるという形で対応できたのですが、今回のように、前回切り出した数字も含めて抽出したい場合どのようにすればよいのかわかりません。

補足情報(FW/ツールのバージョンなど)

PHP 7.2.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こうですかね?

PHP

1$str="ヒルトン系列ホテルに泊まる1日目イタリア8日間"; 2$pattern="/(.).{9}\d+(?=日)/u"; 3$offset=0; 4while(preg_match($pattern,$str,$match,PREG_OFFSET_CAPTURE,$offset)){ 5 print $match[0][0]."<br>"; 6 $offset=$match[0][1]+strlen($match[1][0]); 7}

投稿2018/08/01 07:16

yambejp

総合スコア114850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agep31

2018/08/01 07:24

ご回答ありがとうございます。抽出パータンのところで、.{10}ではなく、(.).{9}としているのはなぜなのでしょうか?
yambejp

2018/08/01 07:26

10文字の最初の1文字を拾っています=$match[1][0] その文字列の長さ分offset位置をずらします
guest

0

ずらしながらループするしかないんじゃないでしょうか。

PHP

1$text = "ヒルトン系列ホテルに泊まる1日目イタリア8日間"; 2 3$i = 0; 4while(preg_match('/.{10}\d+?(?=日)/u',$text,$result,PREG_OFFSET_CAPTURE,$i)){ 5 var_dump($result); 6 $i = $result[0][1]; 7 $i += strlen(mb_substr(substr($text,$i),0,1)); 8}

「次の文字位置」を求めるのにもっと良い方法があるかも。

投稿2018/08/01 05:28

otn

総合スコア84598

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agep31

2018/08/01 07:13

ご回答ありがとうございます。$i += strlen(mb_substr(substr($text,$i),0,1));の部分がわからないのですが、何をやっているのでしょうか?
otn

2018/08/01 07:38 編集

> 「次の文字位置」を求める です。 次回のサーチは、今回見つかった先頭文字の次の文字からサーチし始めます。 「次の文字」ということで、バイトオフセットで+1しちゃうと、次のマルチバイト文字の途中バイトになっちゃうので。 プラス1じゃなくて、マッチした先頭文字の、バイト長(strlen)だけプラスします。 つまり、今回見つかった文字位置に対して、次が半角文字なら+1、全角文字(3バイト)なら+3するということ。 と日本語で書いてみると、 $i = $result[0][1] + strlen(mb_substr($result[0][0],0,1)); でいいのか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問