PHP,与preg_replace(RegEx)不一致的结果

PHP,与preg_replace(RegEx)不一致的结果,regex,Regex,我正在寻找一个正确的方向,因为我从preg_replace得到的结果对我来说没有意义 我有以下正则表达式: /([a-zA-Z0-9]{1,})/([a-zA-Z0-9]{1,})/([a-zA-Z0-9_]{1,})/([a-zA-Z0-9_]{1,})/([a-zA-Z0-9_]{1,})\b 我有一个文件,它由以下行组成: 1: */tdn/quota/plot_3/boot_tdd_8/Homes_Homes1/boot/bplsed/ruc001/No Files/pl1/Coo

我正在寻找一个正确的方向,因为我从preg_replace得到的结果对我来说没有意义

我有以下正则表达式:

/([a-zA-Z0-9]{1,})/([a-zA-Z0-9]{1,})/([a-zA-Z0-9_]{1,})/([a-zA-Z0-9_]{1,})/([a-zA-Z0-9_]{1,})\b
我有一个文件,它由以下行组成:

1: 

*/tdn/quota/plot_3/boot_tdd_8/Homes_Homes1/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*

2:

*/vdm/quota/plot_1/boot_tdd_1/Homes_Homes2/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*

3:

*/vdm/quota/plot_5/boot_tdd_3/Homes_Homes1/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*
我的目标是只保留/Homes\u Homes/part之后的所有内容

我用正则表达式正确替换了第一个文件路径:

*/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*
第二个文件路径也正确:

*/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*
但是,对于我得到的最后一个文件路径:

*/container.rig* 
而不是

*/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*

为什么preg_replace会用第三个文件路径失败

得到最后一个结果的原因是,将替换所有匹配项,在最后一个示例中,字符串将替换模式

您可能要做的是将第四个参数
$limit
设置为1,以进行单个替换

并非模式中的所有字符类都与下划线匹配,但如果可以这样做,则可以使用量词
{5}
缩短模式,并锚定
^
以断言srting的开头,并使用\K进行匹配,然后忘记字符串开头的
*

^\*\K(?:/\w+){5}
|

比如说

$re = '~^\*\K(?:/\w+){5}~';
$strings = [
    "*/tdn/quota/plot_3/boot_tdd_8/Homes_Homes1/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*",
    "*/vdm/quota/plot_1/boot_tdd_1/Homes_Homes2/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*",
    "*/vdm/quota/plot_5/boot_tdd_3/Homes_Homes1/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*"
];

foreach ($strings as $s) {
    echo preg_replace($re, '', $s) . PHP_EOL;
}
输出

*/boot/bplsed/ruc001/No Files/pl1/Cookies/MMTException/container.rig,11/12/2017,29/11/2017,29/11/2017*
*/.etc/nonrig_tile_edit.vids,07/08/2014,07/08/2014,07/08/2014*
*/boot/int/rlt111/pl1/Cookies/container.rig,19/11/2019,13/11/2017,13/11/2017*

您的模式在最后一个字符串中匹配两次。您必须使用的第4个参数将替换限制为1,或者使用锚定
^
*
的捕获组,并在替换中使用
$1
,如果模式中的所有重复部分都可以与
\w+
匹配,您也可以使用
^*\K(?:/\w+{5}
非常感谢,非常感谢你的帮助和解释。我现在明白为什么我的正则表达式不能正常工作了。