13

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

4

5 に答える 5

6

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

于 2011-07-31T15:54:20.587 に答える
5

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

于 2011-12-04T02:44:50.260 に答える
3

上記のユーザー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
于 2015-04-07T19:40:08.157 に答える
0

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を参照)

于 2017-11-03T15:38:30.987 に答える
-1

私は解決策を見つけました。これは理想的ではありませんが、純粋なSQLソリューションが表面化しない場合に備えてここに配置します。MySQLのurlフィールドを「/articles/%/ page /%」のままにして、使用する変数名のリストを格納する変数と呼ばれる別のフィールドを追加できます。そうすれば、元のクエリを使用して、データを取得した後、戻り値の「%」文字をPHPの「{{variable}}」に置き換えてsprintfを使用できます。

それでも、この概念は価値があると思うので、可能であればSQLでこれを解決してもらいたいと思います。

于 2009-11-10T03:46:05.920 に答える