PHP preg_replace 模式似乎只有在错误的情况下才有效?

标签 php regex

我有一个看起来像这样的字符串

../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/

相关文章:

来自存储在数据库中的数组的php输出复选框然后显示选中如果选中

php - 多个 php 类(Symfony Controller )可访问的函数

php - 准备好的语句适用于 INSERT 但不适用于 SELECT

php - PDO exec 不工作,数据库仍然是空的

regex - -匹配成功但不更新 $matches

python - 删除所有嵌套 block ,同时通过 python 单独保留非嵌套 block

PHP __DIR__ 或 __FILE__ 符号链接(symbolic link)

regex - 如何在Notepad++中找到单引号并将其替换为两个单引号?

python - 如何有效地删除非 ASCII 字符和数字,但保留重音 ASCII 字符

mysql - 如何从 WordPress (MySQL) 中的多个帖子中删除宽度和高度属性