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

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

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

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

正規表現

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

Q&A

解決済

4回答

2923閲覧

PHP preg_matchと正規表現で日付を取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

正規表現

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

0グッド

0クリップ

投稿2020/06/23 07:25

preg_matchと正規表現で日付を取得したいのですが、正規表現の記述がきちんとかけていないせいか、出力ができません。

PHP

1<?php 2$time = "'24/Jun/2018:11:07:15 +0000'"; 3$pattern = '/^[0-9]{2}/[Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec]/[0-9]{4}$/'; 4 5 6preg_match($pattern, $time, $date); 7echo $date[1]/$date[2]/$date[3];

24/Jun/2018
↑このような出力結果を求めています。

正規表現の記述方法についてアドバイスいただけたら幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

PHP

1$time = "'24/Jun/2018:11:07:15 +0000'"; 2$pattern = '/^\'([0-9]{2})/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)/([0-9]{4})\'$/'; 3 4 5preg_match($pattern, $time, $date); 6echo $date[1]/$date[2]/$date[3];

ええと、正規表現の []は、「中に書いた文字のどれか1文字にマッチ」なので、「JanかFebかMarか……」みたいな文字列に対しては使えません。()で囲んで|で区切ってください。

次に、PHPのpreg_matchの第3引数で部分マッチした文字列を受け取るには、部分マッチさせたい場所を()で囲む(キャプチャする)必要があります。というわけで、日付と西暦年の部分も()で囲んでください。

修正:
よく見ると、対象文字列は(文字として)引用符を先頭と末尾に含んでいたため、パターンにそれらを追加した。

投稿2020/06/23 07:51

編集2020/06/23 09:22
Daregada

総合スコア11990

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

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

退会済みユーザー

退会済みユーザー

2020/06/23 08:11

ありがとうございます!括弧についてのアドバイスありがとうございます!丸括弧と角括弧の違いがよく理解できました!ですが、作成していただいたコードを試したのですが、うまく出力ができません・・。(今自分でも原因を考えています。)
Daregada

2020/06/23 08:18 編集

ああ、よく見たら"の内側に'が付いていますね(なぜ??)。 '/^\'([0-9]{2})/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)/([0-9]{4})\'$/' と^の後と$の前に \' を付けてみてください。
退会済みユーザー

退会済みユーザー

2020/06/23 08:49

ありがとうございます。何度も答えていただき、すみません。助かりました!
guest

0

すでに指摘が出ている箇所は飛ばすとして、

[Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec]

文法の理解が間違っているように思います。角括弧ではなく丸括弧であるべきところですね。

投稿2020/06/23 07:47

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2020/06/23 08:12

ありがとうございます!丸括弧なんですね・・・!
guest

0

無理に正規表現にしなくても

PHP

1<?php 2 3$time = "'24/Jun/2018:11:07:15 +0000'"; 4list($date,$other) = explode(":",$time); 5$date = str_replace("'","",$date); 6 7echo $date; //出力結果 24/Jun/2018

みたいな感じで整形しちゃうのはダメでしょうか。

もしくはdate()DateTimeに渡して日付として扱う

PHP

1<?php 2 3$time = str_replace("'","","'24/Jun/2018:11:07:15 +0000'"); 4echo date("d/M/Y",strtotime($time));

投稿2020/06/23 07:33

編集2020/06/23 07:43
tanat

総合スコア18713

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

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

退会済みユーザー

退会済みユーザー

2020/06/23 07:37

ありがとうございます。こういう方法もあるのですね。ですが、正規表現でのやり方を調べてまして‥。アクセスログの日付を成果表現で切りとって出力する方法を調べてます。$timeの中身の数字や月が変わっても出力できるような正規表現を考えています。すみませんがアドバイスいただけたら幸いです。
guest

0

+0000が微妙ですねGMTなのでしょうか?

PHP

1$time = "24/Jun/2018:11:07:15 +0900"; 2print date("d/M/Y",strtotime($time));

投稿2020/06/23 07:39

yambejp

総合スコア114777

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

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

退会済みユーザー

退会済みユーザー

2020/06/23 08:14

ありがとうございます。課題として取り組んでいるものなので、GMTの正しい値かどうかは不明です。
yambejp

2020/06/23 08:24

+0000だと、日本時間で表示すると $time = "24/Jun/2018:20:07:15 +0000"; が「25/Jun/2018」になってしまいます
退会済みユーザー

退会済みユーザー

2020/06/23 08:58

なるほど、そうなんですね・・ ありがとうございます!ちょっと調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問