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

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

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

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

正規表現

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

Q&A

解決済

3回答

1493閲覧

PHPで特殊な条件での取得

maguroyamiy

総合スコア12

PHP

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

正規表現

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

0グッド

0クリップ

投稿2016/08/02 10:26

編集2016/08/06 06:11
$schedule = "15:00~20:00" //"~"より前の文字を切り出して出勤時間のみ取得 //"15:00" $in = substr($schedule, 0, strcspn($schedule,'~')); //"~"より後ろの文字を切り出して退勤時間のみ取得 //"~20:00" $out2 = strstr($schedule, "~"); //これでは"~"が残ってしまうので除去 //"20:00" $out = str_replace("~","",$out2);

###前提・実現したいこと

PHP初心者です。Goutteでスクレイピングをしています。

あるところから上記のように出勤と退勤を抽出しているのですが、ごくまれに

$schedule = "15:00~20:00/20:00~翌4:00"

と言った表記があります。

もし「~」が2つあるなら (あるいは文字列に「/」が含まれているなら)
最後の「~」より後ろの文字切り出して退勤時間(翌4:00)のみ取得

という条件をしたいのですが、どのようなコードになるでしょうか。

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

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

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

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

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

kei344

2016/08/02 10:40

ひとまず表記のバリエーションを全て記載されてはいかがでしょうか。
maguroyamiy

2016/08/02 10:42

バリエーションとなると何万以上もあるので数え切れません。 例に出した分だけでは出来ないでしょうか。
kei344

2016/08/02 10:47

時間ではなく区切り文字や付加される文字列のパターンが数万有るということでしょうか?
maguroyamiy

2016/08/02 10:49

そうですね、区切り文字は「/」と「/」「・」の3種類ですが、 付加される文字は人の名前がきたりメモが書かれたりしますので...
Zuishin

2016/08/02 11:04

シンプルに `[/d:]+` では?
guest

回答3

0

Gouttaは良く知らないですが、正規表現であれば
最小マッチを利用して /^.*?(\d?\d[::]\d\d)//.*(\d?\d[::]\d\d).*?$/ ではどうでしょうか。

投稿2016/08/02 11:14

flied_onion

総合スコア2604

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

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

maguroyamiy

2016/08/06 06:12

申し訳ありません、ややこしいと思いましたので質問の内容を変更しました。
guest

0

ベストアンサー

正規表現はパターンマッチですから、その想定されるデータの全てが一文で表現可能な定義を常に満たすもので無いと全てに対応できるものを考えるのは難しいです。
例えばですが、「[00:00]このパターンに一致する文字列を全て抜き出し、最初に登場する値が出勤時間、最後に登場する値が退勤時間である。」に全ての入力が一致するならやりようはあると思います。

ちょっとコードあってるか自信ないですが、例えばこんな感じ

php

1$subject = "本日の出退勤は15:00~20:00/20:00~翌4:00です"; 2$pattern = '/\d{1,2}:\d{2}/'; 3preg_match_all($pattern, $subject, $m); 4print_r("出勤: ".$m[0][0]." / 退勤: ".end($m[0])); 5//出勤: 15:00 / 退勤: 4:00

投稿2016/08/02 11:10

編集2016/08/02 11:39
hirohiro

総合スコア2068

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

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

0

「区切り文字」がそれだあって、かつ「区切り文字」以外に使われない
という前提条件が確定できるのであれば、「区切り文字」の有無で
処理を分けるのが分かりやすい気がします。
ちなみに、時間表記(数字、コロン、"~")にブレはないんですよね?

投稿2016/08/02 11:08

takasima20

総合スコア7460

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

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

maguroyamiy

2016/08/06 06:13

区切り文字はその3つ以外にないので間違いありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問