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

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

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

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

正規表現

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1552閲覧

phpのソース中に意図不明点

hotta

総合スコア1613

PHP

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

正規表現

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/10/03 07:09

laravel5 の勉強がてらソースを見ていて、何をしたいのかよくわからないところが
ありました。

vendor/laravel/framework/src/Illuminate/Support/Str.php

php

198 /** 299 * Cap a string with a single instance of a given value. 3100 * 4101 * @param string $value 5102 * @param string $cap 6103 * @return string 7104 */ 8105 public static function finish($value, $cap) 9106 { 10107 $quoted = preg_quote($cap, '/'); 11108 12109 return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; 13110 }

preg_quote($cap, '/') は、'/' および正規表現の特殊文字をすべてエスケープする。

http://php.net/manual/ja/function.preg-quote.php

正規表現の中の '?:' は、「値のキャプチャを行わない」
=パターンを見つけてもマッチさせない(無視する)ということ?
http://php.net/manual/ja/regexp.reference.subpatterns.php

/u は「UTF-8 として処理する」
http://php.net/manual/ja/reference.pcre.pattern.modifiers.php
ということのようです。

この finish() メソッドを使っている箇所を vendor/ 配下で grep してみましたが、
このラッパーであるヘルパー関数 str_finish() 以外は、残念ながら見つけられませんでした。

bash

1$ php artisan tinker 2Psy Shell v0.7.2 (PHP 7.0.11 — cli) by Justin Hileman 3>>> use Illuminate\Support\Traits\Macroable; 4=> null 5>>> $s = new Str; 6=> Illuminate\Support\Str {#675} 7>>> $s->finish("abc123[123][123]\[123\]/123/xyz", "[123]"); 8=> "abc123[123][123]\[123\]/123/xyz[123]" 9>>> $s->finish("abc123[123][123]\[123\]/123/xyz", "/123/"); 10=> "abc123[123][123]\[123\]/123/xyz/123/"

preg_replace() の replacement が '' なので、セキュリティがらみ(?)で
何らかのパターンを排除(削除)しようとしているのではないかとも思うのですが、
どういうケースでこれが役立つのか、おわかりの方がおられましたら教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

公式サイトに出ている例から推測される用途として、「パスの最後をスラッシュ終わりに統一する」という用法が考えられます。

/path/to/foo/bar/path/to/foo/bar/のどちらが来ても正しく処理できるようにこのような変換を入れることは、Laravelに限らずちょくちょくあります。

投稿2016/10/03 07:15

maisumakun

総合スコア145183

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

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

hotta

2016/10/04 00:43

ユースケースとしては理解できました。 ノーマライズの一種ということですね。 いったんこちらをベストアンサーとさせていただきますが、 正規表現の意図(実際のコードの意味)についても、 引き続きコメントをお待ちしております。
maisumakun

2016/10/04 00:54

preg_quoteを入れないと、(この例でのスラッシュもそうですが)正規表現のメタ文字と認識されて、正常に動作しなくなります。
hotta

2016/10/04 01:05

preg_quote() の公式マニュアルに載っている例から preg_quote() を 外して実行したら、エラー(Compilation failed)になることを確認しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問