Php 一个正则表达式,用于匹配不同位置的零件

Php 一个正则表达式,用于匹配不同位置的零件,php,regex,dsn,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(来自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中提取host和dbname部分,同时我希望能够增强我的知识;-)有办法吗?

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

尝试这样做,使得正则表达式匹配任何一种情况都可能有点过火,并且如果您添加第三或第四项检查,将很快失去控制

事实上,你可能不需要拆开绳子就能脱身

编辑:

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

所以你可以这么做

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/
可减少为:

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

您可能需要根据您的regex风格进行调整,我只习惯于.net

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

/^(\w+):((dbname|host)=(\w+))?;?((dbname|host)=(\w+))?/
但是它可以匹配mysql:host=localhost;主机=本地主机也