我有一个看起来像这样的字符串
../Clean_Smarty_Projekt/tpl/templates_c\.
../Clean_Smarty_Projekt/tpl/templates_c\..
我想用正则表达式替换 ../
、\.
和 \..
。
之前,我是这样做的:
$result = str_replace(array("../","\..","\."),"",$str);
它(模式)必须按这个顺序,因为更改它会使输出有点错误。所以我决定使用正则表达式。
现在我想出了这个模式
$result = preg_replace('/(\.\.\/)|(\\[\.]{1,2})/',"",$str);
实际上只返回空字符串...
原因:(\\[\.]{1,2})
在 Regex101一切都好。 (我花了几分钟才意识到我不需要 preg_replace 中的 /g
)
如果我在 preg_replace 中使用此模式,我必须执行 (\\\\[\.]{1,2})
才能使其正常工作。但这显然是错误的,因为我不是在寻找两个斜杠。
我当然知道转义规则(转义斜杠)。
为什么这不正确匹配?
最佳答案
我建议您使用不同的 php 分隔符。在 /
分隔符中,您需要使用三个 \\\
或四个 \\\\
反斜杠来匹配单个反斜杠。
$string = '../Clean_Smarty_Projekt/tpl/templates_c\.'."\n".'../Clean_Smarty_Projekt/tpl/templates_c\..';
echo preg_replace('~\.\./|\\\.{1,2}~', '', $string)
输出:
Clean_Smarty_Projekt/tpl/templates_c
Clean_Smarty_Projekt/tpl/templates_c
关于PHP preg_replace 模式似乎只有在错误的情况下才有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066663/