2

我正在尝试使用正则表达式解析 DSN(来自 Symfony 应用程序),以便与辅助应用程序链接,但使用相同的数据库。

我目前拥有的DSN是:

mysql:dbname=my_db_name;host=localhost

正则表达式为:

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

(使用preg_match())。这匹配正常,但在我的测试环境中失败,因为 DSN 元素被切换,因此:

mysql:host=localhost;dbname=my_testdb_name

我可以切换它们,是的 :-) 但我确信可以使用单个正则表达式从两个 DSN 中提取主机和 dbname 部分,并且我希望能够同时增强我的知识时间;-) 有没有办法我可以做到这一点?

4

2 回答 2

1

我会在';'上拆分字符串 然后在拆分字符串的每个部分上为我感兴趣的每个部分使用单独的正则表达式。

尝试这样做以使正则表达式匹配任何方式都可能有点矫枉过正,并且如果您添加第三或第四项要检查的内容,很快就会失控。

实际上,您可能无需实际拆分字符串就可以逃脱。

编辑:

啊刚刚重新阅读了这个问题,似乎这个字符串是一个较长字符串的一部分。

所以你可以这样做

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

可以简化为:

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

你可能需要调整你的正则表达式的风格,我只习惯 .net

于 2010-04-23T13:34:45.557 回答
1

以下表达式可以匹配两个 DSN

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

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

于 2010-04-23T13:41:34.930 回答