我试图转义字符串中
{{
和 }}
中包含的每个字符,因此:
d-m-Y {{warning}}
变成这样:
d-m-Y \{\{\w\a\r\n\i\n\g\}\}
我正在尝试使用
preg_replace
来实现它:
$int = preg_match_all('/(\{\{.*?\}\})/', $format, $matches, PREG_SET_ORDER);
if( $int )
{
$to_replace = preg_replace('/(.+?)/', "\\$1", $matches[0][0]);
$format = str_replace( $matches[0][0], $to_replace, $format );
}
但是替换函数将其转换为
$1$1$1$1$1$1$1$1$1$1$1
,我显然在这里做错了什么。
基本上
\\$1
在你的模式中应该变成 \\\$1
。
但是,您可以在这里使用
preg_replace_callback()
:
$string = 'd-m-Y {{warning}}';
echo preg_replace_callback('/\{\{.*?\}\}/', function($match) {
return preg_replace('/./', '\\\$0', $match[0]);
}, $string);
输出:
d-m-Y \{\{\w\a\r\n\i\n\g\}\}
在测试过程中,我发现还有比
preg_replace()
更快的方法来替换回调函数中的字符。您可以使用wordwrap()
:
echo preg_replace_callback('/\{\{.*?\}\}/', function($match) {
return wordwrap($match[0], 1, '\\', true);
}, $string);
这将比上述尝试快约 15%。
如果你想转义字符串中的每个字符,这个解决方案会快得多。您可以避免复杂的正则表达式解决方案。但只有当您想要转义整个字符串或者可以像示例中那样添加转义部分时,它才有效。
$escaped = 'd-m-Y \\'.join("\\",str_split('{{warning}}'));
echo $escaped;
输出:
d-m-Y \{\{\w\a\r\n\i\n\g\}\}
如果不需要回调函数,可以实现 continue 元字符(
\G
)。
代码:(演示)
$string = 'd-m-Y {{warning}}'; // this also works
$string = 'd-m-Y {{warning}} more text';
echo preg_replace('/{(?=\{\S*?\}\})|\G(?!^)\S/', '\\\$0', $string);
// d-m-Y \{\{\w\a\r\n\i\n\g\}\} more text