web-dev-qa-db-ja.com

PHPのpreg_replaceに相当するMySQLはありますか?

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は正しい比較ではなくなりました。これを達成する方法はありますか?

12
Travis

MySQLでpreg_replaceを提供するユーザー定義関数のライブラリがあります: http://www.mysqludf.org/lib_mysqludf_preg/

6
sagi

あなたがやりたいことは、データベースに新しい構文があり、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/

4
quickshiftin

上記のユーザーsagihttp://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
3
billynoah

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