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

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

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

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

正規表現

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

Q&A

解決済

2回答

325閲覧

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

agep31

総合スコア29

PHP

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

正規表現

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

0グッド

1クリップ

投稿2018/07/30 07:24

前提・実現したいこと

phpの正規表現を使って文字列の抽出をしています。以下のような文字列から、「6文字」+「数字」+「日」という文章のみを抽出したいのですが、うまく抽出できません。

<文字列>
ホテルに泊まる12日目イタリア8日間

該当のソースコード

<?php $text = "ホテルに泊まる12日目イタリア8日間"; preg_match_all('/......[\d]+日/u', $text, $result); echo "<pre>"; print_r($result[0]); echo "</pre>";

出力結果

Array ( [0] => テルに泊まる12日 )

理想の出力結果

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

試したこと

最初に「テルに泊まる12日」を抽出した際に、残りの文章が「目イタリア8日」になってしまい、「6文字」+「数字」+「日」の組み合わせにマッチしないのが原因なのはわかっているのですが、どのように改善すればよいのかわからなく困っています。

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

PHP 7.2.5

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

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

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

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

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

guest

回答2

0

ベストアンサー

こうですかね

PHP

1$text = "ホテルに泊まる12日目イタリア8日間"; 2if(preg_match_all('/.{6}\d+?(?=日)/u', $text, $result)){ 3 array_walk($result[0],function(&$x){$x.="日";}); 4} 5print_r($result); 6 7

投稿2018/07/30 07:42

yambejp

総合スコア114839

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

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

agep31

2018/07/30 07:56

ご回答ありがとうございます。array_walk関数のところがよくわからないのですが、これは正規表現で取り出したものに対して、「日」という言葉を加えるということでしょうか?
yambejp

2018/07/30 07:59

正規表現では日を消費しないで6文字+数字を抽出しています。 ほしいデータは「日」までが必要ということなので あとから日を付加しています
guest

0

php

1<?php 2 3$text = "ホテルに泊まる12日目イタリア8日間"; 4 5preg_match_all('/\D{1,6}\d+日/u', $text, $result); 6 7echo "<pre>"; 8print_r($result[0]); 9echo "</pre>";

数字じゃない文字を1回~6回の繰り返し、その後数字の繰り返し、その後「日」
っていう意味に直さないとヒットしないでしょうね。

投稿2018/07/30 07:30

編集2018/07/30 07:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

agep31

2018/07/30 07:39

ご回答ありがとうございます。{}を使って文字の繰り返しを表せばよいのですね。ありがとうございました。
yambejp

2018/07/30 07:44

命題と少し主旨がかわっていませんか?
agep31

2018/07/30 07:46

yambejpさん 申し訳ありません。私の確認不足でした。m6uさんのプログラムですと、二つ目が5文字しか取れていませんでしたね。
退会済みユーザー

退会済みユーザー

2018/07/30 07:55

1つ目の文字列の切り出しに使用しているのだから、取れなくて当然って思ってますけど、そうじゃないのですか、そうですか。
yambejp

2018/07/30 07:58

6文字とるのが必須条件なのに5文字しか取らない時点で主旨がちがうと思います。いかに1つ目のデータ取得の際に「日」を消費しなければよい話です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問