За последние 24 часа нас посетили 19890 программистов и 1694 робота. Сейчас ищет 1701 программист ...

Как избавиться от взаимозамен?

Тема в разделе "Регулярные выражения", создана пользователем kostyl, 5 май 2009.

  1. kostyl

    kostyl Guest

    Есть код:
    PHP:
    1.  
    2. <?php
    3. $sText = ' 123 class 12.3';
    4. $arRep = array('/\b\d+(\.\d+)?/iu', '/\b(class)\b/iu');
    5. $arHtml = array('<span class="digit">$0</span>', '<span class="keyword">$1</span>');
    6. echo preg_replace($arRep, $arHtml, $sText);
    7. ?>
    8.  
    В результате происходит взаимозамена и получается:
    HTML:
    1.  
    2. <span <span class="keyword">class</span>="digit">123</span> <span class="keyword">class</span> <span <span class="keyword">class</span>="digit">12.3</span>
    3.  
    Можно как то этого избежать не изменяя регулярок?
     
  2. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    kostyl

    Если так уж принципиально нельзя трогать регулярки, то сделай двойную надстройку - типа PreDispatch() и PostDispatch(). В первой функции готовишь текст к обработке, во второй возвращаешь не место то, что уже не надо.

    Я так понимаю, нужно сделать так, чтобы "class=..." не обрамлялось? В PreDispatch() отлови все подобные вхождения и замени их на какое-нибудь "cla_s_s". В PostDispatch() найди все "cla_s_s" и верни на место.
     
  3. kostyl

    kostyl Guest

    не принципиально, просто я думал может есть какой способ, применить все последовательно, причем первая регулярка захватит, то что ей надо, а вторая то что останеться. Вот например есть '/(#\d+)+/iu' и '/\b\d+(\.\d+)?/iu'. В моем вымышленном способе было бы идеально... Твой метод тут уже сильно напряжный...
     
  4. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Я не спорю :) Просто думал тебе критически важно сохранить регулярки.
     
  5. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    kostyl
    ну наверняка логично просто поменять местами:
    PHP:
    1. <?php
    2.  $arRep = array('/\b(class)\b/iu', '/\b\d+(\.\d+)?/iu');
    3.  $arHtml = array('<span class="keyword">$1</span>', '<span class="digit">$0</span>');
    т.е. сначала слова, а потом тока цифры :)
     
  6. kostyl

    kostyl Guest

    это один из примеров, чтобы понятно было - в реальности же бывает так, что ничего не пререставишь...
     
  7. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    kostyl
    ну этот пример по-крайней мере будет корректным для любого текста :)