Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:preg_替换文件路径_Php_Regex_Preg Replace - Fatal编程技术网

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