一个正则表达式匹配不同位置的部分

时间:2010-04-23 13:29:32

标签: php regex dsn

我正在尝试使用正则表达式解析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中提取主机和dbname部分,我希望能够增强我的知识在同一时间;-)有没有办法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

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

尝试这样做,所以正则表达式的匹配可能有点过度,如果你添加了第三或第四件要检查的话,很快就会失去控制。

事实上,你可以在没有实际拆分字符串的情况下离开。

编辑:

啊,只是重新阅读了这个问题,看来这个字符串是更长字符串的一部分。

所以你可以这样做

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

可以简化为:

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

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

答案 1 :(得分:1)

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

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

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