-1

我有这个JS代码:

var str = "foo bar";
var res1 = str.replace(new RegExp('foo\\b', 'g'), "BAZ");
var res2 = str.replace(new RegExp('foo', 'g'), "BAZ");
console.log("Result1: " + res1 + " Result2: " + res2);

控制台上的结果Chrome Version 69.0.3497.81 (Official Build) (64-bit)是:

Result1: BAZ bar Result2: BAZ bar

现在我测试相同的PHP代码V8Js扩展测试相同的代码:

PHP代码:

<?php
$v8 = new V8Js();
$JS = <<<EOT
var str = "foo bar";
var res1 = str.replace(new RegExp('foo\\b', 'g'), "BAZ");
var res2 = str.replace(new RegExp('foo', 'g'), "BAZ");
print("Result1: " + res1 + " Result2: " + res2);
EOT;
echo $v8->executeString($JS);

PHP 7.2.9 (cli) (built: Aug 15 2018 05:57:41) ( NTS MSVC15 (Visual C++ 2017) x64 )WithV8Js Version 2.1.0扩展的结果:

Result1: foo bar Result2: BAZ bar

为什么结果不同result1?!!!

4

1 回答 1

2

您正在使用".
这意味着它将解释\为转义。

如果您使用Nowdoc它将等同于 '因此不会转义反斜杠。

当您阅读手册时,这并不完全明显,但您需要阅读有关 Nowdoc 的信息才能看到 Heredoc 是双引号。

Nowdocs 是单引号字符串,就像 heredocs 是双引号字符串。

这意味着将您的字符串声明更改为:

$JS = <<<'EOD'
var str = "foo bar";
var res1 = str.replace(new RegExp('foo\\b', 'g'), "BAZ");
var res2 = str.replace(new RegExp('foo', 'g'), "BAZ");
print("Result1: " + res1 + " Result2: " + res2);
EOD;
于 2018-09-11T13:57:46.947 回答