PHP:preg_替换文件路径
我对这个正则表达式感到困惑:PHP:preg_替换文件路径,php,regex,preg-replace,Php,Regex,Preg Replace,我对这个正则表达式感到困惑: preg_replace('/\/[\s\S]+?_/', '/', $currentFile) 它改变了这一点: /public\u html/ftp/Products/1010\u空气+冷却+冷凝器/productsheet\u旋转+滚筒+干燥器+BR.pdf 对此:html/空气+冷却+冷凝器/旋转+滚筒+干燥器+BR.pdf 预期结果: /public\u html/ftp/Products/Air+冷却+冷凝器/旋转+滚筒+干燥器+BR.pdf “/pr
preg_replace('/\/[\s\S]+?_/', '/', $currentFile)
它改变了这一点:
/public\u html/ftp/Products/1010\u空气+冷却+冷凝器/productsheet\u旋转+滚筒+干燥器+BR.pdf
对此:html/空气+冷却+冷凝器/旋转+滚筒+干燥器+BR.pdf
预期结果:
/public\u html/ftp/Products/Air+冷却+冷凝器/旋转+滚筒+干燥器+BR.pdf
“/productsheet”
也可以是“/fish-cb”
或“/appeltaartenbakker”
“/1010\u”
始终是具有此长度的数字。根据这些文件路径的格式,您可以尝试:
preg_replace('/[0-9]{4}_(.+\/).+_/','\1',$currentFile)
我在PHP7.0.3和vim中使用以下工具对其进行了测试:
/public_html/ftp/Products/1010_Air+Cooled+Condenser/productsheet_Rotary+Drum+Dryer+BR.pdf
/public_html/ftp/Products/1020_Air+Cooled+Condenser/fish-cb_Rotary+Drum+Dryer+BR.pdf
/public_html/ftp/Products/1030_Air+Cooled+Condenser/appeltaartenbakker_Rotary+Drum+Dryer+BR.pdf
使用此命令和非常神奇的模式\v
:
:%s/\v[0-9]{4}_(.+\/).+_/\1/g
/public_html/ftp/Products/Air+Cooled+Condenser/Rotary+Drum+Dryer+BR.pdf
/public_html/ftp/Products/Air+Cooled+Condenser/Rotary+Drum+Dryer+BR.pdf
/public_html/ftp/Products/Air+Cooled+Condenser/Rotary+Drum+Dryer+BR.pdf
我相信你在找我
'~(?!^)/[^/]+_~'
看。如果需要使其在第一个之前停止,请将下划线添加到[…]
:'~(?!^)/[^./]+.'
详细信息
(?!^)
-不在字符串开头
/
-一个/
字符(无需转义,因为我使用~
作为正则表达式分隔符字符)
[^/]+
-1个或多个字符,而不是/
-一个
字符
这是否意味着您不想在字符串开头匹配该模式?尝试或(?!^)\/[^\/]+
,如果您只需要在该子部分的/
之后和第一个\
之前移除零件。@WiktorStribiż您能解释一下刚才在那里做了什么吗?它起作用了!我的意思是,“/productsheet\u”
可以是任何字符串。更新以匹配任何字符串。
$str = '/public_html/ftp/Products/1010_Air+Cooled+Condenser/productsheet_Rotary+Drum+Dryer+BR.pdf';
$result = preg_replace('~(?!^)/[^/]+_~', '/', $str);
echo $result; // => /public_html/ftp/Products/Air+Cooled+Condenser/Rotary+Drum+Dryer+BR.pdf