3v4l.org

run code in 300+ PHP versions simultaneously
<?php $offsets = [ 1 => [0,2], 2 => [2,5], 3 => [8,9] ]; $html = <<<HTML <div>This is</div> only a test for stackoverflow HTML; $ignoreTag = false; $insertTagStart = false; $char = 0; for ($i = 0; $i < strlen($html); ++$i) { if ($ignoreTag && $html[$i] == '>') { $ignoreTag = false; } elseif ($html[$i] == '<') { if ($insertTagStart !== false) { // insert tag interruption, print closing tag, modify the lookup ++$offsets[$insertTagStart][0]; $html = substr_replace($html, "</span>", $i, 0); $i += 6; // </span> = 7 minus 1 before loop's increment } $ignoreTag = true; } else { foreach ($offsets as $id => $set) { if ($char == $set[0]) { $insertTagStart = $id; $insertTag = "<span class='annotation n-{$id}'>"; $i += strlen($insertTag) - 1; // compensate for inserted substring while traversing html $html = substr_replace($html, $insertTag, $char, 0); } elseif ($insertTagStart == $id && $set[1] == $char) { $html = substr_replace($html, "</span>", $char, 0); $insertTagStart = false; } } ++$char; } echo "{$char},\t" , ($ignoreTag ? 't' : 'f') , ",\t" , ($insertTagStart === false ? 'f' : $insertTagStart) , ",\t" , $html , "\n"; } echo $html;
Output for 7.1.25 - 7.1.30, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.27, 8.2.0 - 8.2.17, 8.3.0 - 8.3.4
0, t, f, <div>This is</div> only a test for stackoverflow 1, t, 1, <span class='annotation n-1'><div>This is</div> only a test for stackoverflow 2, t, 1, <span class='annotation n-1'><div>This is</div> only a test for stackoverflow 3, t, 2, <s<span class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 4, t, 2, <s<span class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 5, t, 2, <s<span class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 6, t, f, <s<sp</span>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 7, t, f, <s<sp</span>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 8, t, f, <s<sp</span>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 9, t, 3, <s<sp</s<span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 10, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 11, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 12, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 13, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 14, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 15, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 16, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 17, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 18, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 19, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 20, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 21, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 22, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 22, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 22, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 23, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 24, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 25, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 25, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 26, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 27, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 28, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 29, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 30, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 31, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 32, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 32, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 33, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 34, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 35, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 36, t, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 36, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 37, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 38, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 39, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 40, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 41, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 42, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 43, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 44, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 45, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 46, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 47, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 48, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 49, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 50, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 51, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 52, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 53, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 54, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 55, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 56, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 57, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 58, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 59, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 60, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 61, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 62, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 63, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 64, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 65, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow 66, f, f, <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow <s<sp</s<</span>span class='annotation n-3'>pan>an class='annotation n-2'></span>pan class='annotation n-1'><div>This is</div> only a test for stackoverflow

preferences:
212.61 ms | 427 KiB | 163 Q