MySQLのフィールドに一致するものがあり、正規表現を使用できると思いましたが、MySQLにはその仕事に必要な機能がないようです。シナリオは次のとおりです。
PHPに$ urlという変数があります。この変数が文字列 "/ article/my-article/page/2"として設定されているとします。MySQLにもURLのテーブルがあります。そこからコンテンツを取得したいのですが、テーブルに保存されているURLにはワイルドカードが含まれています。
以前は、テーブルに格納されている値が「/ article /%/ page /%」のようになるように設定していました。
その構成で、私はただ実行することができました:
SELECT * FROM urls WHERE '$url' LIKE url
そして、これは一致します。これは、必要な機能です。
私が今やりたいのは、「/ article /%/ page /%」の代わりに、MySQLデータが「/ article/{{slug}}/page/{{」になるように、より高度なワイルドカードを許可することです。 page_no}} "。
同じ$ url入力を使用して、このデータに一致するSQLクエリを作成したいと思います。組み込みの「%」ワイルドカードではなく、{{。*}}を使用しているため、LIKEは正しい比較ではなくなりました。これを達成する方法はありますか?
MySQLでpreg_replaceを提供するユーザー定義関数のライブラリがあります: http://www.mysqludf.org/lib_mysqludf_preg/
あなたがやりたいことは、データベースに新しい構文があり、URLにphpベース(sprintf)の変数置換コードに渡すプレースホルダーがありますが、それでもURLと一致するように元の比較を行うことができるようです。
私が正しく理解しているなら、あなたは新しいURLフォーマットを取りたいと思うでしょう
/article/{{slug}}/page/{{page_no}}
そしてそれを次のようなものと照合します
/article/my-article/page/2
前述のpregプラグインsagiは、必要な置換を実行できます。これにより、新しくフォーマットされたURLの1つが、LIKE構文を使用して一致を判別するために使用した元のフォーマットに変換されます。次のクエリ:
SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls;
新しいURL(/ article/{{slug}}/page/{{page_no}})を元のURLに変換します
/article/%/page/%
次に、次のように、元のクエリを介してフィードバックできます。
SELECT * FROM urls
WHERE '/article/my-article/page/2' LIKE preg_replace('/({{.*?}})/', '%', `url`);
MAMP、XAMMPなどの一部のバイナリディストリビューションにはプラグインがすでにインストールされていますが、Macports/Ubuntuなどの多くのシステムにはインストールされていません。 pregプラグインのインストールに関する記事をいくつか紹介します。それが役に立てば幸い。
http://quickshiftin.com/blog/2011/04/installing-mysql-preg-plugin-osx-macports/
http://quickshiftin.com/blog/2011/12/installing-the-mysql-preg-plugin-on-ubuntu-with-apt-get/
上記のユーザーsagiは http://www.mysqludf.org/lib_mysqludf_preg/ に言及していますが、この回答は非常に古いため、チュートリアルのほとんどですが、この質問の初心者のために、これを拡張したいと思いました。
第一に、図書館は本当に素晴らしく、経験から言えば、それは維持されているようであり、2015年もまだ完璧に機能していると言えます。
それをインストールして機能させるために、私はいくつかの非常に古いチュートリアルしか見つけることができなかったので、Ubuntu 14.04に最新の安定版リリース(v1.1)をインストールするために私が行ったことを共有したいと思いました:
apt-get update
apt-get install libpcre3-dev libmysqlclient-dev build-essential libmysqld-dev libpcre3-dev
wget https://github.com/mysqludf/lib_mysqludf_preg/archive/lib_mysqludf_preg-1.1.tar.gz
tar -xzf lib_mysqludf_preg-1.1.tar.gz
cd lib_mysqludf_preg-1.1
./configure
make install
make installdb
service mysql restart
これで、次のすべての機能を使用できるようになります。
lib_mysqludf_preg_info
preg_capture
preg_check
preg_replace
preg_rlike
preg_position
Mysql 5.5以降では、 [〜#〜] rlike [〜#〜] :を使用できます。
uRLをREGEXPスタイルで保存し、
SELECT * FROM urls WHERE '$ url'RLIKE url;
または、LIKEスタイルのままにして、置き換えます(%by。*、_ by。):
SELECT * FROM urls WHERE '$ url'RLIKE REPLACE(REPLACE(url、 '%'、 '。*')、 '_'、 '。');
完了するには、正規表現で重要な文字をエスケープするために他の置換を行う必要があります:? \()[] ...(php関数を参照 preg_quote )