Php 正则表达式负前缀和后缀

Php 正则表达式负前缀和后缀,php,regex,preg-match,pcre,Php,Regex,Preg Match,Pcre,我有以下字符串,例如: download-google-chrome-free download-mozilla-firefox-free 还有这些字符串: google-chrome mozilla-firefox 我的前缀是​​下载-我的后缀是​​-free,我需要一个正则表达式来捕获单词googlechrome,如果输入字符串没有download-和-free前缀和后缀,则捕获的组就是字符串本身 字符串1=免费下载谷歌chrome(带前缀和sufix) 字符串2=谷歌浏览器(不带前缀和

我有以下字符串,例如:

download-google-chrome-free
download-mozilla-firefox-free
还有这些字符串:

google-chrome
mozilla-firefox
我的前缀是​​<代码>下载-我的后缀是​​
-free
,我需要一个正则表达式来捕获单词
googlechrome
,如果输入字符串没有
download-
-free
前缀和后缀,则捕获的组就是字符串本身

字符串1=免费下载谷歌chrome(带前缀和sufix)

字符串2=谷歌浏览器(不带前缀和sufix)

你能做到吗?我正在使用
PHP
使用
preg\u match

preg_match('/(download-)?(google-chrome|mozilla-firefox)(-free)?/', $string, $match);
表示前面的组是可选的。如果前缀或后缀不在字符串中,则
$match
中的这些捕获组将为空

preg_match('/(download-)?(google-chrome|mozilla-firefox)(-free)?/', $string, $match);
如果您实际上不想返回带有可选前缀和后缀的组,请将
?:
放在组的开头,使其成为非捕获组:

preg_match('/(?:download-)?(google-chrome|mozilla-firefox)(?:-free)?/', $string, $match);

现在,
$match[1]
将包含您想要的浏览器名称。

有关断言,请参阅。您可以尝试此
$a=“google chrome free”;预匹配(“/(?:\w+-)?(\w+-\w+(:-\w+)?/”,$a,$match)你可以告诉他,$match[2]将捕获他想要的内容,因为match[1]是“下载”,所以我误解了它——“我需要一个正则表达式来捕获google chrome这个词,如果输入字符串没有下载和免费前缀和后缀,那么捕获的组就是字符串本身。”他显然有英语问题(他是巴西人)。我查看了他想要的输出示例。我更新了答案以显示非捕获组。根据这个答案,Apache 2支持非捕获组。
preg_match('/(?:download-)?(google-chrome|mozilla-firefox)(?:-free)?/', $string, $match);