I want to change /<?phps([sS]*?)?>/gi the way that single line PHP tags become excluded.
For example, here I want to match only second PHP tag and not the first one:
Test number <?PHP echo($a);?> is here. This is test number <?PHP echo($b); $b = $a?> that expanded across multiple lines.
Advertisement
Answer
You can use
<?php(?!S)((?:(?!<?php(?!S)|?>).)*R[sS]*?)?>
A variation with multiline .:
<?phps((?:(?!<?phps|?>).)*R(?s:.*?))?>
See the regex demo. Details:
<?php– a<?phpsubstring(?!S)– a right-hand whitespace boundary (immediately to the right, there must be either a whitespace or start of string)((?:(?!<?php(?!S)|?>).)*R[sS]*?)– Group 1:(?:(?!<?php(?!S)|?>).)*– any single char other than a line break char, zero or more and as many as possible occurrences, that does not start a<?php + a right-hand whitespace boundary or?>` char sequenceR– a line break sequence[sS]*?/(?s:.*?)– any zero or more chars as few as possible
?>– a?>substring.