2010-04-23 36 views
2

我想使用正則表達式來解析DSN(來自Symfony應用程序),以便與輔助應用程序鏈接,但使用相同的數據庫。一個正則表達式,以匹配不同位置的部分

的DSN我目前有是:

mysql:dbname=my_db_name;host=localhost 

與一個正則表達式:

/^(\w+):(dbname=(\w+))?;?(host=(\w+))?/ 

(使用preg_match())。這符合OK,但由於DSN元件圍繞切換,從而在我的測試環境失敗:

mysql:host=localhost;dbname=my_testdb_name 

我可以切換他們圓,是:-)但我敢肯定的是,主機,數據庫名的提取來自兩個DSN的部分可能只有一個正則表達式,我希望能夠同時增強我的知識;-)有沒有辦法做到這一點?

回答

1

我會將字符串拆分爲';'然後對每個我感興趣的部分使用單獨的正則表達式,分割字符串的每個部分。

試圖做到這一點,所以正則表達式匹配哪種方式可能有點矯枉過正,如果你添加了第三或第四件事來檢查,可能會很快失去控制。

事實上,如果不實際拆分字符串,您可能會脫身。

編輯:

啊只是重新閱讀的問題,看來這串是更長字符串的一部分。

,所以你能做到這一點

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/ 

這可以減少到:

/^(\w+):((dbname|host)=(\w+));?+ 

您可能需要調整您的正則表達式的味道,我只用.NET

+0

好東西 - 謝謝:-) – richsage 2010-04-23 14:05:42

1

以下表達式可能與兩個DSN相匹配

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/ 

但它可以匹配mysql:host = localhost; host = localhost ...

+1

+1關於可能出現的問題的說明。 – 2010-04-23 14:08:37