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

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

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

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

正規表現

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

Q&A

解決済

1回答

2710閲覧

PHP Warning: preg_match()エラーの原因が分かりません

planetsman

総合スコア18

PHP

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

正規表現

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

0グッド

0クリップ

投稿2019/07/09 06:29

環境
MacOS Mojave 10.14.5
VirtualBox 6.0.0
Vagrant 2.2.3
CentOS Linux release 7.6.1810
Apache/2.4.6
PHP 5.4.16
mysql5.7.26

パーフェクトPHPというPHPの参考書を見ながらブログシステムの構築を行っているのですが、以下のエラーの原因が突き止められません。

Warning: preg_match(): Compilation failed: unrecognized character after (? or (?- at offset 12 in /var/www/mini-blog.com/application/core/Router.php on line 38

エラー該当のファイルは以下です。
core/Router.php

<?php class Router { protected $routes; public function __construct($difinitions) { $this->routes = $this->compileRoutes($difinitions); } public function compileRoutes($difinitions) { $routes = array(); foreach($difinitions as $url => $params){ $tokens = explode('/',ltrim($url,'/')); foreach($tokens as $i => $token){ if(0 === strpos($token,':')){ $name = substr($token,1); $token = '(?p<' . $name . '>[^/]+)'; } $tokens[$i] = $token; } $pattern = '/' . implode('/', $tokens); $routes[$pattern] = $params; } return $routes; } public function resolve($path_info) { if ('/' !== substr($path_info, 0, 1)) { $path_info = '/' . $path_info; } foreach ($this->routes as $pattern => $params) { if (preg_match('#^' . $pattern . '$#', $path_info, $matches)) { $params = array_merge($params, $matches); return $params; } } return false; } }

コンパイル失敗
38行目の/var/www/mini-blog.com/application/core/Router.phpのオフセット12の位置にある文字列の後に認識できない文字があります

というエラーメッセージなので正規表現にミスがあるのかと思われますが原因を突き止められないため質問させていただきます。

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

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

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

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

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

m.ts10806

2019/07/09 06:33 編集

$routesと$path_infoをvar_dump()した結果を質問本文にご提示ください。 ※提示されたコードだけでは再現確認できないので、できれば最小構成で確認できるコードも欲しいです https://teratail.com/help/question-tips#questionTips3-5-1 >最も良いのは、現象を再現するためのミニマムなプログラムを改めて作ることです。
planetsman

2019/07/09 07:06

ご回答ありがとうございます。 今回の件は正規表現のスペルミスでした。 現在参考書を見ながら学習を進めており、ご指摘頂いたvar_dump関数を用いてのデバッグ方法などイマイチどのように行えばいいのか分かりかねる状態です。 学習を進めていく上で理解を深めていけるよう尽力してまいります。
m.ts10806

2019/07/09 07:11

「適切なデバッグ方法」というのはケースバイケースなので、 とりあえず利用している変数をvar_dump($hoge); のように入れるだけで十分かと思います。そこから推測できることもあるので。 分岐を通っているか確認したければ echo __LINE__; とかですね。書かれた箇所のプログラムファイルの行数が出力されます。
planetsman

2019/07/09 07:30

ご返信いただき有難うございます。 今回の質問とはズレてしまうので大変恐縮なのですが、今回フレームワークを利用して体系的に学習を進めており、どこでどのような処理が行われているのか細かに理解が追いついていない状態となっております。 例えば今回でいうと mini-blog.com/index_dev.php/account/signup.php をブラウザからアクセスした際に出たエラーについて質問させていただいたのですが、エラーの原因はRouter.php内のスペルミスでした。 このような場合はsignup.phpにvar_dumpを入れるのか、Router.php内にvar_dumpを入れるのかもしくはまた別のファイルにて記述する必要があるのかなど混乱してしまいました。 ご教授頂いた echo __LINE__; なども適切に利用できるように学習を進めてまいります。
guest

回答1

0

ベストアンサー

(?pは、(?Pの間違いではないかと思います。

(?P<name>pattern) という記法を用いて サブパターンに名前をつけることができます。(PHPマニュアルより)

投稿2019/07/09 06:45

maisumakun

総合スコア145184

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

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

planetsman

2019/07/09 07:03

ご回答頂きありがとうございます。 解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問