use strict;
my $str = '<div id=\'content\' onClick=\'abc()\'>Lorem On=\'abc\' ipsum on to</div>
<input id=\'a\' type=\'range\'>
<input id=\'b\' type=\'range\'>
<script>abc();</script>
Jan23: The following is an addition set of tests including escaping quotes and .replace(/\'/ situations that can cause problems.
<div id=\'content\'
onClick=\'yyy("ere\\\'xyz\\\'").value=\\\'ewew\\\'; yyy("jhrhej")\'
>Lorem On=\'abc\' ipsum on to</div>
<input id=\'a\' type=\'range\'
onPress="xxx(document.getElementById(\\"abc\\"))"
onSomething="yyy(\\\'fehrje\\\')"
onSomethingElse="document.getElementById(\'content\').innerHTML.replace(/"/g, \\"dq\\")">
<input id=\'b\' type=\'range\'>
<script>
function abc() {console.log(\'abc()\');};
function xxx(elem) {console.log(\'xxx:\'+elem.className);};
function yyy(str) {console.log(\'yyy:\'+str);};
yyy("ere\\\'xyz\\\'");
yyy("jhrhej");
var aaa=document.getElementById(\'content\').innerHTML;
var bbb=document.getElementById(\'content\').innerHTML;
abc();
aaa.replace(/\'/g, "single-quotes");
bbb.replace(/\'/g, \'single-quotes\');
aaa.replace(/"/g, "quotes");
bbb.replace(/"/g, \'quotes\');
</script>
</body>
</html>';
my $regex = qr/(<script\b[^><]*>)(.*?)(<\/script>)|\bon\w+\s*=\s*\K(?|(\")([^\"]+)\"|(')([^']+)')/isp;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
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 Perl, please visit: http://perldoc.perl.org/perlre.html