diff --git a/CHANGES.md b/CHANGES.md
index 83d50a02d6..ca0cb2443b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -17,11 +17,13 @@ Grammars:
- added 3rd party Candid grammar to SUPPORTED_LANGUAGES [rvanasa][]
- fix(haskell) Added support for characters [CrystalSplitter][]
- enh(dart) Add `base`, `interface`, `sealed`, and `when` keywords [Sam Rawlins][]
+- enh(php) detect newer more flexible NOWdoc syntax (#3679) [Timur Kamaev][]
Parser:
- add removePlugin api [faga295][]
+[Timur Kamaev]: https://github.com/doiftrue
[WisamMechano]: https://github.com/wisammechano
[faga295]: https://github.com/faga295
[AdamRaichu]: https://github.com/AdamRaichu
diff --git a/src/languages/php.js b/src/languages/php.js
index f0e5f8ef68..13fde3abb5 100644
--- a/src/languages/php.js
+++ b/src/languages/php.js
@@ -51,10 +51,18 @@ export default function(hljs) {
illegal: null,
contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST),
});
- const HEREDOC = hljs.END_SAME_AS_BEGIN({
- begin: /<<<[ \t]*(\w+)\n/,
+
+ const HEREDOC = {
+ begin: /<<<[ \t]*(?:(\w+)|"(\w+)")\n/,
end: /[ \t]*(\w+)\b/,
contains: hljs.QUOTE_STRING_MODE.contains.concat(SUBST),
+ 'on:begin': (m, resp) => { resp.data._beginMatch = m[1] || m[2]; },
+ 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); },
+ };
+
+ const NOWDOC = hljs.END_SAME_AS_BEGIN({
+ begin: /<<<[ \t]*'(\w+)'\n/,
+ end: /[ \t]*(\w+)\b/,
});
// list of valid whitespaces because non-breaking space might be part of a IDENT_RE
const WHITESPACE = '[ \t\n]';
@@ -63,7 +71,8 @@ export default function(hljs) {
variants: [
DOUBLE_QUOTED,
SINGLE_QUOTED,
- HEREDOC
+ HEREDOC,
+ NOWDOC
]
};
const NUMBER = {
diff --git a/test/markup/php/strings.expect.txt b/test/markup/php/strings.expect.txt
index 8a9c4dd8f5..953138b52d 100644
--- a/test/markup/php/strings.expect.txt
+++ b/test/markup/php/strings.expect.txt
@@ -17,7 +17,18 @@ MSG);
FROM table
SQL);
-var_dump(<<<SQL
+var_dump(<<<"SQL"
SELECT *
FROM table
SQL);
+
+
+
+$var = <<<'TEXT'
+ Hello {$person->name}! Welcome to $company!
+TEXT;
+
+var_dump(<<<'TEXT'
+ Hello {$person->name}! Welcome to $company!
+ TEXT);
+
diff --git a/test/markup/php/strings.txt b/test/markup/php/strings.txt
index d539d549a8..6e879722bf 100644
--- a/test/markup/php/strings.txt
+++ b/test/markup/php/strings.txt
@@ -17,7 +17,17 @@ var_dump(<<name}! Welcome to $company!
+TEXT;
+
+var_dump(<<<'TEXT'
+ Hello {$person->name}! Welcome to $company!
+ TEXT);