За последние 24 часа нас посетили 17524 программиста и 1313 роботов. Сейчас ищут 1145 программистов ...

Замена за исключением значений между тегами

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

  1. rudoy24

    rudoy24 Новичок

    С нами с:
    5 окт 2015
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте.
    Есть код который вставляет после найденых абзацов "<p>...</p>" слово "text".
    -----------------------
    Код (PHP):
    1. $after_p = 'text';
    2. $row->text = preg_replace('/<\/p>/', '</p>'. $after_p, $row->text, 5); 
    -----------------------
    Необходимо исключить вставку слова "text" если в теле поиска будет обнаружена <table> или <blockquote> в которых будут находится теги абзацов.

    К примеру тело поиска:
    -----------------------
    Код (PHP):
    1. <p>...</p>
    2. <p>...</p>
    3. <table>
    4. <tr>
    5. <td><p>...</p></td>
    6. <td><p>...</p></td>
    7. </tr>
    8. </table>
    9. <p>...</p>
    10. <blockquote><p>...</p></blockquote>
    11. <p>...</p> 
    -----------------------

    Что должно получится:
    -----------------------
    Код (PHP):
    1. <p>...</p>text
    2. <p>...</p>text
    3. <table>
    4. <tr>
    5. <td><p>...</p></td>
    6. <td><p>...</p></td>
    7. </tr>
    8. </table>
    9. <p>...</p>text
    10. <blockquote><p>...</p></blockquote>
    11. <p>...</p>text
    -----------------------
    То есть в таблице и в цитатах после абзацов не добавлять слово "text". Приведенный код выше вставляет "text" и в таблице и в цитатах.

    Добавлено спустя 13 минут 11 секунд:
    Следующим кодом возможно добиться исключения вставки слова "text" между тегами <table>, но как еще добится и того что бы не вставляло между тегами <blockquote>?
    ----------------------------
    Код (PHP):
    1. $xx='<p>...</p>
    2. <p>...</p>
    3. <table>
    4. <tr>
    5. <td><p>...</p></td>
    6. <td><p>...</p></td>
    7. </tr>
    8. </table>
    9. <p>...</p>';
    10.  
    11. $mask='<<<%s>>>';
    12. $pl=array();
    13.  
    14. $yy=preg_replace_callback(
    15. '~<table>.*?</table>~is',
    16. function($m) use (&$pl,$mask){
    17. $pl[]=$m[0];
    18. return sprintf($mask,count($pl));
    19. },
    20. $xx
    21. );
    22.  
    23. $tt=preg_replace('/<\/p>/', '</p>text', $yy);
    24.  
    25. $zz=preg_replace_callback(
    26. '~'.sprintf(preg_quote($mask,'~'),'(.*?)').'~si',
    27. function($m) use ($pl){
    28. return $pl[$m[1]-1];
    29. },
    30. $tt
    31. );
    32. print_r($zz); 
    ----------------------------

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. rudoy24

    rudoy24 Новичок

    С нами с:
    5 окт 2015
    Сообщения:
    2
    Симпатии:
    0
    РЕШЕНО!
    Возможно код громоздкий, но работает. Если есть у кого-то другие варианты, просьба поделится.
    ----------------------------
    Код (PHP):
    1. <?php
    2.  
    3. $xx='<p>...</p>
    4. <p>...</p>
    5. <table>
    6. <tr>
    7. <td><p>...</p></td>
    8. <td><p>...</p></td>
    9. </tr>
    10. </table>
    11. <p>...</p>
    12. <blockquote><p>...</p></blockquote>
    13. <p>...</p>';
    14.  
    15. $mask='<<<%s>>>';
    16. $pl=array();
    17.  
    18.     '~<table>.*?</table>~is',
    19.     function($m) use (&$pl,$mask){
    20.         $pl[]=$m[0];
    21.        return sprintf($mask,count($pl));
    22.     },
    23.     $xx
    24. );
    25.  
    26.     '~<blockquote>.*?</blockquote>~is',
    27.     function($m) use (&$pl,$mask){
    28.         $pl[]=$m[0];
    29.        return sprintf($mask,count($pl));
    30.     },
    31.     $xx
    32. );
    33.  
    34. $tt=preg_replace('/<\/p>/', '</p>text', $yy);
    35.  
    36.     '~'.sprintf(preg_quote($mask,'~'),'(.*?)').'~si',
    37.     function($m) use ($pl){
    38.         return $pl[$m[1]-1];
    39.     },
    40.     $tt
    41. );
    42. print_r($zz); 
    ----------------------------

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    работает и ладно =)