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

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

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

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

正規表現

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

Q&A

解決済

2回答

1570閲覧

正規表現で直接文字列を入力しないと抽出できない現象

pegy

総合スコア245

PHP

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

正規表現

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

0グッド

0クリップ

投稿2021/09/10 08:15

編集2021/09/10 08:50

下記の通り、$get_contentsの変数をpreg_matchに代入してもなにも結果が得られませんでした。オンラインの正規表現チェッカー等でえられているのに不思議に思い試行錯誤していたのですが、

php

1var_dump($get_contents); 2//string(1499) "全銀協日本円TIBOR ( JBA Japanese Yen TIBOR ) ※本情報の再配信を希望する場合は、当法人までお問い合わせください。       Please contact us(JBATA), when you want to re-distribute this information. 2021/08/31更新(updated) (単位 年% percent per annum) 1WEEK 1MONTH 2MONTH 3MONTH 4MONTH 5MONTH 6MONTH 7MONTH 8MONTH 9MONTH 10MONTH 11MONTH 12MONTH 2021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/30 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/27 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/26 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/25 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/24 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/23 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/20 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/19 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/18 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/17 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/16 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/13 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/12 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/11 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/10 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/06 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/05 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/04 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/03 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/02 -0.00636 0.08545 0.05727 0.11636 0.14636" 3 4preg_match('@2021/08/31 (.+?) 2.../@',$get_contents,$res); 5var_dump($res);//array(0) { }

改めて、以下のように直接変数を文字列として代入すると正しく結果が出力されます。

php

1preg_match('@2021/08/31 (.+?) 2.../@s', 'string(1499) "全銀協日本円TIBOR ( JBA Japanese Yen TIBOR ) ※本情報の再配信を希望する場合は、当法人までお問い合わせください。       Please contact us(JBATA), when you want to re-distribute this information. 2021/08/31更新(updated) (単位 年% percent per annum) 1WEEK 1MONTH 2MONTH 3MONTH 4MONTH 5MONTH 6MONTH 7MONTH 8MONTH 9MONTH 10MONTH 11MONTH 12MONTH 2021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/30 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/27 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/26 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/25 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/24 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/23 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/20 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/19 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/18 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/17 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/16 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/13 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/12 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/11 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/10 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/06 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/05 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/04 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/03 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/02 -0.00636 0.08545 0.05727 0.11636 0.14636"', $res); 2var_dump($res) 3//array(2) { [0]=> string(57) "2021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/" [1]=> string(40) "-0.00364 0.08545 0.05727 0.11636 0.14636" }

改行等のパターン修飾子も付してみたのですが、どうしても変数代入から取得できず、なぜこのような現象がおきるのかわからず、ご助言と解決方法をご教示いただきたく、お願い申し上げます。

【追記】完全版のコード
利用ライブラリ他参考にしたもの
php ver:7.4.1

php

1// ini_set('display_errors', "On"); 2use Spatie\PdfToText\Pdf; 3require_once __DIR__ . '/vendor/autoload.php'; 4 5$parser = new \Smalot\PdfParser\Parser(); 6$pdf = $parser->parseFile('https://www.jbatibor.or.jp/rate/pdf/JAPANESEYENTIBOR210831.pdf'); 7$get_contents = $pdf->getText(); 8var_dump($get_contents); //正しく出力 9preg_match("@2021/08/31 (.+?) 2.../@",$get_contents,$res); 10var_dump($res); //array(0){}

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

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

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

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

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

yuuyu

2021/09/10 08:23

上のコードで、array(0) { }が再現できませんでした。前後に省略されているコード等があればそちらも提示してください。
pegy

2021/09/10 08:40

はい、ライブラリも使用しているため、少しわかりづらい部分もあるかもしれませんが本文に追記いたします。
guest

回答2

0

ベストアンサー

var_dumpをそのまま使うと改行が空白に置換されて表示されるので、pre要素の内容として出力するようにしてみると、

diff

1+echo "<pre>"; 2var_dump($get_contents); 3+echo "</pre>";

実際の$get_contentsは以下のように改行を含んでいました。

result

1string(1499) "全銀協日本円TIBOR ( JBA Japanese Yen TIBOR ) 2※本情報の再配信を希望する場合は、当法人までお問い合わせください。 3      Please contact us(JBATA), when you want to re-distribute this information. 42021/08/31更新(updated) (単位 年% percent per annum) 51WEEK 1MONTH 2MONTH 3MONTH 4MONTH 5MONTH 6MONTH 7MONTH 8MONTH 9MONTH 10MONTH 11MONTH 12MONTH 62021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636 72021/08/30 -0.00364 0.08545 0.05727 0.11636 0.14636 8(中略) 92021/08/03 -0.01364 0.08545 0.05727 0.11636 0.14636 102021/08/02 -0.00636 0.08545 0.05727 0.11636 0.14636"

ということで、日付の後の文字列を取得するには、

diff

1-preg_match("@2021/08/31 (.+?) 2.../@",$get_contents,$res); 2+preg_match("@2021/08/31 (.+?)\n2.../@", $get_contents, $res); 3+echo "<pre>"; 4var_dump($res); 5+echo "</pre>";

のように、空白ではなく改行を指定する必要があります。改行で充分に判別できるので、実際には2.../の指定は不要でしょう。

result

1array(2) { 2 [0]=> 3 string(57) "2021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636 42021/" 5 [1]=> 6 string(40) "-0.00364 0.08545 0.05727 0.11636 0.14636" 7}

また、複数行モード(m)を指定して、各行の行頭から行末までマッチするか調べれば、

PHP

1preg_match_all("@^\d{4}/\d{2}/\d{2} (.+?)$@m", $get_contents, $res); 2echo "<pre>"; 3var_dump($res); 4echo "</pre>";

result

1array(2) { 2 [0]=> 3 array(21) { 4 [0]=> 5 string(51) "2021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636" 6 [1]=> 7 string(51) "2021/08/30 -0.00364 0.08545 0.05727 0.11636 0.14636" 8(中略) 9 [19]=> 10 string(51) "2021/08/03 -0.01364 0.08545 0.05727 0.11636 0.14636" 11 [20]=> 12 string(51) "2021/08/02 -0.00636 0.08545 0.05727 0.11636 0.14636" 13 } 14 [1]=> 15 array(21) { 16 [0]=> 17 string(40) "-0.00364 0.08545 0.05727 0.11636 0.14636" 18 [1]=> 19 string(40) "-0.00364 0.08545 0.05727 0.11636 0.14636" 20 [2]=> 21(中略) 22 [19]=> 23 string(40) "-0.01364 0.08545 0.05727 0.11636 0.14636" 24 [20]=> 25 string(40) "-0.00636 0.08545 0.05727 0.11636 0.14636" 26 } 27}

のように、まとめて取り込めます。


なお、質問者のコードは、Smalot/PdfParserだけを使用し、Spatie\PdfToTextはまったく使っていないので、use Spatie\PdfToText\Pdf;は不要です。

投稿2021/09/10 12:30

編集2021/09/10 12:33
Daregada

総合スコア11990

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

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

pegy

2021/09/11 14:15

ご回答を頂きありがとうございます。また、ご返信が遅くなりましたこと深くお詫び差し上げます。 さて、まず「Spatie\PdfToText」についてですが、失礼しました。削除漏れです。 また、問題点と解決法ですが、とてもクリアになりました。 「var_dumpをそのまま使うと改行が空白に置換されて表示される」 本件、お恥ずかしながら存じ上げませんでした。試しに<pre>タグで挟んでみて自分でも確認することができました。今後正規表現でおかしい?と思った場合には同様の手続も必ずチェックしてみようと思います。 解決に至ることができて本当に良かったです、感謝でございます。よろしくお願い申し上げます。
Daregada

2021/09/11 14:24

ブラウザーがレンダリングする際に、(HTMLの仕様として)連続した空白文字(スペース、改行、タブなど)を1個にまとめて表示しています。pre要素の内容にする以外に、開発ツールなどで確認することもできます。
pegy

2021/09/11 16:05

なるほど、大変勉強になりました、ご回答者とteratailにありがとうございます!
guest

0

問題ないとは思いますがいちおうuスイッチ付けておくとかどうでしょう?(UTF8が前提)

php

1$pattern='@(?<=2021/08/31 ).+?(?= 2.../)@su'; 2$get_contents='全銀協日本円TIBOR ( JBA Japanese Yen TIBOR ) ※本情報の再配信を希望する場合は、当法人までお問い合わせください。       Please contact us(JBATA), when you want to re-distribute this information. 2021/08/31更新(updated) (単位 年% percent per annum) 1WEEK 1MONTH 2MONTH 3MONTH 4MONTH 5MONTH 6MONTH 7MONTH 8MONTH 9MONTH 10MONTH 11MONTH 12MONTH 2021/08/31 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/30 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/27 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/26 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/25 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/24 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/23 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/20 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/19 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/18 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/17 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/16 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/13 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/12 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/11 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/10 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/06 -0.00364 0.08545 0.05727 0.11636 0.14636 2021/08/05 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/04 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/03 -0.01364 0.08545 0.05727 0.11636 0.14636 2021/08/02 -0.00636 0.08545 0.05727 0.11636 0.14636'; 3var_dump($get_contents); 4print "<hr>"; 5preg_match($pattern,$get_contents,$res); 6var_dump($res); 7

投稿2021/09/10 08:33

編集2021/09/10 08:34
yambejp

総合スコア116724

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

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

pegy

2021/09/10 08:40

コメントありがとうございます。はい、同じようにuスイッチを付してもだめでした。。上で修正依頼にもコメントがあったため、前後のコードを記載いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問