Результат разницы для RegExp в V8J на PHP и Console Chrome - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть этот код 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 ) с расширением V8Js Version 2.1.0:

Result1: foo bar Result2: BAZ bar

Почему результат разницы для result1? !!!

1 Ответ

0 голосов
/ 11 сентября 2018

Вы используете Heredoc , что эквивалентно ".
Это означает, что \ будет интерпретироваться как экранирующий.

Если вы используете 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;
...