Есть код: PHP: <?php $sText = ' 123 class 12.3'; $arRep = array('/\b\d+(\.\d+)?/iu', '/\b(class)\b/iu'); $arHtml = array('<span class="digit">$0</span>', '<span class="keyword">$1</span>'); echo preg_replace($arRep, $arHtml, $sText); ?> В результате происходит взаимозамена и получается: HTML: <span <span class="keyword">class</span>="digit">123</span> <span class="keyword">class</span> <span <span class="keyword">class</span>="digit">12.3</span> Можно как то этого избежать не изменяя регулярок?
kostyl Если так уж принципиально нельзя трогать регулярки, то сделай двойную надстройку - типа PreDispatch() и PostDispatch(). В первой функции готовишь текст к обработке, во второй возвращаешь не место то, что уже не надо. Я так понимаю, нужно сделать так, чтобы "class=..." не обрамлялось? В PreDispatch() отлови все подобные вхождения и замени их на какое-нибудь "cla_s_s". В PostDispatch() найди все "cla_s_s" и верни на место.
не принципиально, просто я думал может есть какой способ, применить все последовательно, причем первая регулярка захватит, то что ей надо, а вторая то что останеться. Вот например есть '/(#\d+)+/iu' и '/\b\d+(\.\d+)?/iu'. В моем вымышленном способе было бы идеально... Твой метод тут уже сильно напряжный...
kostyl ну наверняка логично просто поменять местами: PHP: <?php $arRep = array('/\b(class)\b/iu', '/\b\d+(\.\d+)?/iu'); $arHtml = array('<span class="keyword">$1</span>', '<span class="digit">$0</span>'); т.е. сначала слова, а потом тока цифры