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

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

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

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

Q&A

解決済

6回答

1379閲覧

php ソースをきれいにしたい

curekaishine

総合スコア82

PHP

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

0グッド

1クリップ

投稿2016/03/31 01:27

phpのソースをきれいにしたいです

if( false !== $tmp_title = strstr($title, 'このような内容です。', true) ){
$title = $tmp_title;
}
if( false !== $tmp_title = strstr($title, '上記となっています。', true) ){
$title = $tmp_title;
}

このような内容です。
上記となっています。
のどちらかの文が現れたらそれ以前を取得というコードを書いたのですが
勘ですがもう少しコード量も少なくきれいな書き方があるような気がしています。

調べたところpreg_replaceを使った正規表現ならいけるのでは?と思案しています
みなさんならどういう方法を取りますか?アドバイスなどなどお願いしたいです

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

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

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

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

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

orange0190

2016/03/31 01:34

それらの文が両方とも現れた場合にはどういう動作が正しいですか?
curekaishine

2016/03/31 02:02

$title内で最初に このような内容です。 上記となっています。 のどちらかかがあらわれた箇所より前の部分が取れていればOKです 優劣、文中に何回も出てきた場合などは考慮しなくてOKです
guest

回答6

0

ベストアンサー

これが一番シンプルですね.マッチした部分を空文字列に置換するだけです.

php

1$title = preg_replace('/(?:このような内容です。|上記となっています。).*/s', '', $title);
  • 後ろが.* .+ .*+ .++のいずれかであれば,前で^(.*?) ^(.+?)をマッチングさせる必要はないです.
  • .を任意の1バイトにマッチさせたい場合s修飾子は必須なので付け忘れずに.

【蛇足】

何千回もループしないかぎりほとんど差はでませんが,.*? .+?1オフセットごとに後ろをチェックするため速度低下を招きます.出来るだけ使用は控えめに.また今回は大丈夫ですが,バックトラックが発生するケースでは.* .+も同様です.バックトラックがどうしても動作上必要な場合はしょうがないですが,不必要な場合は .*+ .++ にして抑制をしておくと動作速度が向上することがあります.

投稿2016/03/31 19:21

編集2016/03/31 19:55
mpyw

総合スコア5223

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

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

curekaishine

2016/04/01 07:23 編集

1行且つ読みやすくてかなりいいですね! 補足等ありがとうございます ちなみに ?: はどういう意味なのでしょうか? すみませんぐぐったらのってました。。
mpyw

2016/04/01 09:01

エルビス演算子で?:が出てきてて紛らわしいですが正規表現のほうは全く無関係ですw ( ) はデフォルトではサブパターンとしてキャプチャ対象になります.preg_matchだと$matchesに入ってくるやつです.ところが (?: ) とすると入らなくなります.キャプチャする必要がない部分は一貫してこうしておいたほうが無駄がありません.(あまりにも読みにくくなる場合は気にしなくていいですが,基本はつけましょう)
guest

0

php

1$title = strstr($title, 'このような内容です。', true) ?: $title;

投稿2016/03/31 04:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nnssn

2016/03/31 05:02

strstr() ?: strstr() ?: $title; エルビス演算子のネストなら素直に左から評価されるのでこれもありかも
curekaishine

2016/03/31 09:57

3項演算子というやつですな・・!?
mpyw

2016/03/31 19:41

三項演算子の二項目が潰れて一項目と統合されたものがエルビス演算子です.
m.kosuda

2016/04/01 01:43

注意しなければならないのはPHP5.3以上でないとこちらの記述はできないです。
mpyw

2016/04/01 03:46

今どき5.2の環境とかほとんど無いのでほぼ気にしなくていいですね… 5.4以下のサポートは既に終了していて,5.4をかろうじて意識するかどうか…ぐらいです.
guest

0

間違っているという指摘を受けたので、消しました。
すいません。

投稿2016/03/31 02:11

編集2016/03/31 06:39
kaputaros

総合スコア1844

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

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

..iilllii..

2016/03/31 02:35

間違ってる。正規表現はstrstrじゃ使えない。試せばいいのに。
kaputaros

2016/03/31 04:16 編集

おっと、失礼しました。 正規表現に変えるところにしか注目してなかったもので。 あと、試せばいいのにといわれましても、事情があって試せないんですから、軽々しく言わないで欲しいです。
..iilllii..

2016/03/31 04:57

てんで的はずれな回答に+票が入ってたんでついね。
kaputaros

2016/03/31 06:41 編集

そこは自分に当たるところではない。 >トピ主さん こちらを荒らしてしまって申し訳ないです。
kaputaros

2016/04/04 05:25

CertaiNさん ありがとうございます!参考にさせていただきます。
guest

0

strstr関数は戻り値が文字列又はfalseを返すので
今回の場合はfalseでない場合処理をするということなので下記の書き方が良いと思います。

PHP

1if( ($tmp_title = strstr($title, 'このような内容です。', true)) !== false ){ 2 $title = $tmp_title; 3}

全体のコードの標準化をするのが良いコードだと私は考えるので、
どれが正解とも言えません。
ただ、IF文内で代入をする場合は括弧で囲む方が可読性は増すと思います。

投稿2016/03/31 03:28

編集2016/03/31 03:52
m.kosuda

総合スコア153

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

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

curekaishine

2016/03/31 04:48

>>IF文内で代入をする場合は括弧で囲む方が可読性は増すと思います。 これはおっしゃるとおりですね 気をつけるようにします!
m.kosuda

2016/03/31 05:08

どうしても冗長的・無駄に書きたくないということでなければ、「第三者が保守してもパッと見で処理を理解できる」というコーディングが良いと思います。 なので、質問者様が見やすいと感じたコードはまさに第三者視点からの意見なのでその解答を採用してみてはいかがでしょうか?
mpyw

2016/03/31 19:43 編集

うーん,個人的には無駄な括弧が減った方が読みやすいというところです…人によるのかな… http://qiita.com/mpyw/items/b097da196baf47e58ed9 ここでは触れてませんが,「&&」「||」と「and」「or」を使い分けることによって括弧を減らせることもあります.これも賛否あるので一概にどっちが正しいとは言えませんが.
m.kosuda

2016/04/01 01:49

個人または組織のコーディングポリシーを遵守するが良いと考えるため、私はこの書き方が正解とは言いません。 あくまでも私のルールとして、多項を1つの項として扱う場合は括弧をつけて明示的にグルーピングしています。
guest

0

私も初心者なので、どなたかフォローいただけると幸いなのですが、以下でどうでしょうか?

php

1if(preg_match('/(.*?(:?このような内容です。|上記となっています。))/s', $title, $tmp_title)){ 2$title = $tmp_title[1]; 3}

投稿2016/03/31 02:23

編集2016/03/31 02:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

..iilllii..

2016/03/31 04:57 編集

/(.*?(:?a|b))/だとグループ$1にaまたはbが含まれちゃわないかな? /(.*?)(?:a|b)/になるかな。(後方参照しない、って(?:だよね?) preg_replaceなら $title = preg_replace('/^(.*?)(a|b).*/','$1',$title); かな?
curekaishine

2016/03/31 04:50

ううむ こんなに難しい(strstrよりパッと見て)パターンになるのですね なるほど。。
..iilllii..

2016/03/31 04:58

難しくないよ。基本的なことだから回答なんてする気はないけど、パターン修飾子とかもちゃんと使ってな。
退会済みユーザー

退会済みユーザー

2016/03/31 06:54

..iilllii.. さん、ご指摘ありがとうございます。確かに要件に合致しない正規表現でした。 勉強になります。preg_replace の方がシンプルですね。
mpyw

2016/03/31 19:48

もっとシンプルにしました.
guest

0

コード量のはあまり変わりませんが、検索する文字が増減するのを見越して配列にしておくのも手です。
if周りの書き方は人の好みがある思いますが、個人的に2行に分ける方が好きです。

php

1$needles = ['body', 'upper']; // 検索する文字列を配列で定義 2$title = 'abc body def'; 3 4foreach ($needles as $needle) { 5 $head_title = strstr($title, $needle, true); 6 if (false !== $head_title) { 7 $title = $head_title; 8 break; 9 } 10} 11 12echo $title;

投稿2016/03/31 08:08

rkojima

総合スコア421

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

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

curekaishine

2016/03/31 09:50 編集

配列に格納してしまうのはよさそうですね!ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問