Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Замена за исключением значений между тегами
Форумы портала PHP.SU » PHP » Регулярные выражения » Замена за исключением значений между тегами

Страниц (1): [1]
 

1. rudoy24 - 04 Октября, 2015 - 11:23:46 - перейти к сообщению
Здравствуйте.
Есть код который вставляет после найденых абзацов "<p>...</p>" слово "text".
PHP:
скопировать код в буфер обмена
  1. $after_p = 'text';
  2. $row->text = preg_replace('/<\/p>/', '</p>'. $after_p, $row->text, 5);

Необходимо исключить вставку слова "text" если в теле поиска будет обнаружена <table> или <blockquote> в которых будут находится теги абзацов.

К примеру тело поиска:
CODE (html):
скопировать код в буфер обмена
  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>

Что должно получится:
CODE (html):
скопировать код в буфер обмена
  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" и в таблице и в цитатах.
2. rudoy24 - 05 Октября, 2015 - 18:26: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);

----------------------------
3. rudoy24 - 06 Октября, 2015 - 10:14:50 - перейти к сообщению
РЕШЕНО!
Возможно код громоздкий, но работает. Если есть у кого-то другие варианты, просьба поделится.
----------------------------
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);

----------------------------

 

Powered by ExBB FM 1.0 RC1