You can perform all the <li>
replacements outside of <ol>...</ol>
tags with the following regex:
(?(DEFINE)(?<skip><ol>.*?<\/ol>))(?&skip)(*SKIP)(*FAIL)|\s*<li\s+class="myclass">(.*?)<\/li>\s*
(?(DEFINE) # We set up conditions
(?<skip><ol>.*?<\/ol>)) # What we skip
(?&skip)(*SKIP)(*FAIL) # Fail what we skip
| # Else, match this
\s*<li\s+class="myclass">(.*?)<\/li>\s*
And replacement string will be:
<div class="newClass">$3</div>\n
Then, you will just have to remove <ul>
and </ul>
tags.
See the main regex demo here, and the sample program here.
<?php
$str = "<ul>\n <li class=\"myclass\">blablabla 1</li>\n <li class=\"myclass\">blablabla 2</li>\n <li class=\"myclass\">blablabla 3</li>\n</ul>\n<ol>\n <li class=\"myclass\">blablabla 1</li>\n <li class=\"myclass\">blablabla 2</li>\n <li class=\"myclass\">blablabla 3</li>\n</ol>\n<ul>\n <li class=\"myclass\">blablabla 1</li>\n <li class=\"myclass\">blablabla 2</li>\n <li class=\"myclass\">blablabla 3</li>\n</ul>";
$re = "/(?(DEFINE)(?<skip><ol>.*?<\\/ol>))(?&skip)(*SKIP)(*FAIL)|\\s*<li\\s+class=\"myclass\">(.*?)<\\/li>\\s*/s";
$subst = "<div class=\"newClass\">$3</div>\n";
$result = preg_replace($re, $subst, $str);
echo preg_replace("/<\/?ul>/", "", $result);
?>
Output:
<div class="newClass">blablabla 1</div>
<div class="newClass">blablabla 2</div>
<div class="newClass">blablabla 3</div>
<ol>
<li class="myclass">blablabla 1</li>
<li class="myclass">blablabla 2</li>
<li class="myclass">blablabla 3</li>
</ol>
<div class="newClass">blablabla 1</div>
<div class="newClass">blablabla 2</div>
<div class="newClass">blablabla 3</div>