题
当测试答案时 另一位用户的问题 我发现了一些我不明白的事情。问题是替换所有文字 \t
\n
\r
带有单个空格的字符串中的字符。
现在,我尝试的第一个模式是:
/(?:\\[trn])+/
令人惊讶的是这不起作用。我在 Perl 中尝试了相同的模式,效果很好。经过一番尝试和错误后,我发现 PHP 需要 3 或 4 个反斜杠来匹配该模式,如下所示:
/(?:\\\\[trn])+/
或者
/(?:\\\[trn])+/
令我惊讶的是,这些模式都有效。为什么需要这些额外的反斜杠?
解决方案
您需要 4 个反斜杠来表示正则表达式中的 1,因为:
- 2 个反斜杠用于在字符串中取消转义 (
"\\\\" -> \\
) - 1 个反斜杠用于在正则表达式引擎中取消转义(
\\ -> \
)
从 PHP 文档中,
转义任何其他字符也会导致反斜杠被打印1
因此对于 \\\[
,
- 1 个反斜杠用于取消转义
\
, 一位留下来是因为\[
是无效的 ("\\\[" -> \\[
) - 1 个反斜杠用于在正则表达式引擎中取消转义(
\\[ -> \[
)
是的,它有效,但不是一个好的做法。
其他提示
及其在Perl作品因为你传递直接作为正则表达式模式/(?:\\[trn])+/
但在PHP中,你需要传递的字符串,所以需要额外的转义反斜线本身。
"/(?:\\\\[trn])+/"
在正则表达式\匹配单个 反斜杠将成为“/ \\\\ /”作为 PHP预浸料串
在正则表达式的就是只是/(?:\\[trn])+/
。但既然你一定要逃逸字符串声明以及反斜线,每个反斜线必须用\\
表示:
"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'
就在三退格键也做的工作,因为PHP不知道转义序列\[
并忽略它。所以\\
将成为\
但\[
会留\[
。
使用str_replace函数!
$code = str_replace(array("\t","\n","\r"),'',$code);
应达到目的
不隶属于 StackOverflow