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

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

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

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

Q&A

解決済

4回答

5092閲覧

preg_matchとeregについて

ms90

総合スコア39

PHP

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

0グッド

2クリップ

投稿2017/10/18 06:07

preg_matchとeregの引数に与えるパターンの書きかたについて質問させてください。
http://php.net/manual/ja/function.ereg.php
http://php.net/manual/ja/function.preg-match.php

それぞれ$patternに与える文字列に対して「/」で囲う囲わないの違いはあるのでしょうか?
preg_matchでは「/」で囲わないと必ず「マッチしない」を表す返却値が返ってきてしまうようなのですが。
eregではパターンを囲わない、preg_matchはパターンを「/」で囲うというのが使用方法なのでしょうか。

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

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

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

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

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

guest

回答4

0

ereg が POSIX 拡張
preg-match が Perl 互換
となっており、それぞれの仕様に準じます。

投稿2017/10/18 06:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ms90

2017/10/21 02:03

そもそもベースにしてる仕様が違ったのですね! ありがとうございます。勉強になりました。
guest

0

ベストアンサー

そもそもeregは非推奨の関数で、最新版では削除されていますので
いまさら違いを覚える必要はないのでは?
pregはperl互換の正規表現で、互換性のため多くの言語で採用されている
スラッシュをデリミタに使う書式を基本としていますが、
パターンと競合しなければスラッシュ以外の適当な文字でも問題ありません
また逆にデリミタを書かないでパターンを指定するとエラーになります

投稿2017/10/18 06:23

yambejp

総合スコア114821

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

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

ms90

2017/10/21 02:03

なるほど pregはデリミタが必須なのですね もちろん非推奨のものは使いたくないのですが、書き直さないといけない場面に出くわしてしまいまして... 勉強になりましたありがとうございます。
guest

0

リンク先にも記載がありますが、eregは現在非推奨または削除された関数ですので、使用されない方がよいかと思います。

preg_matchはPCREというPerl言語互換の正規表現を使用するため、正規表現のパターンにオプションを含めることができます。
例えば"/php/i"は大文字小文字を区別せず"php"を含む文字列にマッチします。
そのため、"/"で囲んでパターン文字列の範囲を明示する必要があります。

また、mb_ereg関数はマルチバイトをサポートするereg関数としてまだサポートが継続しているのではないかと思います。

PHP: mb_ereg - Manual
http://php.net/manual/ja/function.mb-ereg.php

投稿2017/10/18 06:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ms90

2017/10/21 02:05

詳しい解説ありがとうございます。 eregがサポートされなくなった経緯など自分で調べてみたいと思います。
退会済みユーザー

退会済みユーザー

2017/10/21 03:17 編集

eregが廃止されたのは、同じことを行う関数としてegrgとpreg_matchの2つがあるというのは冗長でどちらか1つあればよいと考えられたからかと思います。 もちろん両者には違いがあり、詳細はte2jiさんのご回答の通りです。 また、リリースはされませんでしたがPHP6では内部文字表現をUnicodeに統一して扱うという方針があり、ereg関数ではUnicodeをうまく扱うことができなかったために削除することとしていしました。 経緯は下記ページなどに残っています。 https://marc.info/?l=php-internals&m=122684228317217 > deprecate ext/ereg and remove in PHP 6 mb_eregには上記のeregの問題がないと考えられるため、現在も利用できる形で残っているものと思われます。
guest

0

ereg/eregi/ereg_replace/eregi_replace/split/spliti
といった関数はPHP5.3.0で非推奨となり、 PHP7.0.0で削除されています。

php

1if (! function_exists('delimiter')) { 2 function delimiter($pattern, $modifiers = null) 3 { 4 if (isset($modifiers)) { 5 return '/' . $pattern . '/'. $modifiers; 6 } else { 7 return '/' . $pattern . '/'; 8 } 9 } 10}

というようなデリミタを追加する処理を書いておけばpreg_filter/preg_grep/preg_match/preg_match_all/preg_replace/preg_replace_callback/preg_replace_callback_array/preg_splitにパターン文字列を渡すことができます。

$pattern これはパターン文字列を表します。
$modifiers パターン修飾子を指定します。指定しない場合は渡す必要はありません。

以下のように渡せます。

php

1if (preg_match(delimiter('^([test]+)$'), 'test')) { 2 // 処理 3}

投稿2017/11/16 23:20

編集2017/11/16 23:22
naohiro19_

総合スコア178

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

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

ms90

2017/11/17 04:28

なるほどラッパーのようなものを作ってかませてやるわけですね eregを未だに使っているソースに出くわしバージョンアップ対応で書き直さないといけない事態が発生し、質問させていただいておりました。 パターンの書き直しはリスクあるのであまり行いたくなかったのですが、パターンをpreg_matchが期待する形にして対応しました。 サンプルまで書いていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問