2009-11-10 21 views
10

私は正規表現を使うことができると思っていたMySQLのフィールドにマッチさせることができましたが、MySQLは仕事をするために必要な機能を持っていないようです。ここにシナリオがあります:PHPのpreg_replaceに相当するMySQLはありますか?

私は$ urlと呼ばれるPHPの変数を持っています。この変数が文字列 "/ article/my-article/page/2"に設定されているとします。 MySQLには、コンテンツを取得したいURLのテーブルもあります。ただし、私のテーブルに格納されているURLにはワイルドカードが含まれています。

これまで、テーブルに格納された値が "/ article /%/ page /%"のように設定されていました。そのような構成により

、私は実行することができます:

SELECT * FROM urls WHERE '$url' LIKE url 
をそして、これは望ましい機能である、一致します。

"/ article /%/ page /%"の代わりに、私のMySQLデータは "/ article/{{slug}} /ページ/ {{page_no}} "

同じ$ url入力を使用して、このデータと一致するSQLクエリを作成したいとします。 LIKEは組み込みの "%"ワイルドカードを使用しているのではなく、{{。*}}であるため、もはや正しい比較ではありません。どのようにこれを達成するためのアイデア?

答えて

-1

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

私は考えているので、これは可能な限りSQLで解決されていることを確認したいと思います。

はMySQLににpreg_replace与えユーザー定義関数のライブラリがあります
4

それはあなたがURLをあなたに渡すプレースホルダを持つデータベースに新しい構文を持っている何をしたいかのように聞こえますあなたのPHPベースの(sprintf)変数置換コードが、URLに一致するように元の比較を行うことができます。

私が正しく理解していれば、あなたが言及したプリプレグプラグイン鷺を

/article/{{slug}}/page/{{page_no}} 

新しいURL形式を取り、

/article/my-article/page/2 

のようなものに対してそれをマッチさせたいが、あなたが必要な置換を行うことができ、これます新しくフォーマットされたURLの1つを、LIKE構文を使用して一致を判断するために使用した元のフォーマットに変換します。次のクエリ:

SELECT PREG_REPLACE('/({{.*?}})/', '%', `url`) FROM urls; 

それはもともと、その後することができ

/article/%/page/% 

たものに新しいURL(/記事/ {{スラグ}} /ページ/ {{page_noを}})回すだろうあなたの元のクエリを介して帰還、このような何か:

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/

+1

これは正解です。 – dotancohen

3

上記のユーザー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 
+0

https://github.com/mysqludf/lib_mysqludf_preg/blob/testing/INSTALLにあるgithub INSTALLのドキュメントには、かなり良いインストール手順もあります – Slam

0

のMySQL 5.5から始めて、あなたはRLIKE使用することができます。REGEXPスタイル、および '$ URL' RLIKEのURLのURLから

SELECT *を使用してクエリで

  • いずれかの店舗のURLを、

  • またはLIKEスタイルでそれを維持し、交換します(%を*、_による。。):

    SELECT * '$のURL' RLIKEは、REPLACEのURLから( '、(URLをREPLACE % '、'。* ')、' _ '、'。 ');

    これで補完すると、regexp-significantな文字をエスケープする必要があります: \()[] ...(PHP関数preg_quoteを参照)

関連する問題