const regex = /<\? # opening tag
[^?\/]* # all that is not a ? or a /
(?:
\/ # a slash:
(?:
(?![\/*]) [^?\/]* # - not followed by a slash or a *
|
\/.*(?:\n[^?\/]*)? # - that starts a single line comment
|
\* # - that starts a multiline comment
[^*]* (?:\*+(?!\/)[^*]*)* # (comment content)
(?:\*\/ [^?\/]* | $) # */ is optional
)
|
\?(?!>) [^?\/]* # a ? not followed by a >
)*
(?:\?>|$) # optional closing tag ?>/g;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('<\\? # opening tag
[^?\\\/]* # all that is not a ? or a \/
(?:
\\\/ # a slash:
(?:
(?![\\\/*]) [^?\\\/]* # - not followed by a slash or a *
|
\\\/.*(?:\\n[^?\\\/]*)? # - that starts a single line comment
|
\\* # - that starts a multiline comment
[^*]* (?:\\*+(?!\\\/)[^*]*)* # (comment content)
(?:\\*\\\/ [^?\\\/]* | $) # *\/ is optional
)
|
\\?(?!>) [^?\\\/]* # a ? not followed by a >
)*
(?:\\?>|$) # optional closing tag ?>', 'g')
const str = `<? /* hello */ ?>
html
<? /* world*/ ?>
<? /// ?>
dfgdfgdfg?>
<? /* ?> */ ?>
<? /* unclosed
multiline
comment
works until the end of the string `;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions