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

rudoy24

Новичок
Здравствуйте.
Есть код который вставляет после найденых абзацов "<p>...</p>" слово "text".
-----------
$after_p = 'text';
$row->text = preg_replace('/<\/p>/', '</p>'. $after_p, $row->text, 5);
-----------

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

К примеру тело поиска:
-----------
<p>...</p>
<p>...</p>
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>
-----------

Что должно получится:
-----------
<p>...</p>text
<p>...</p>text
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>text
------------

То есть в таблице после абзацов не добавлять слово "text". Приведенный код выше вставляет "text" и в самой таблице.
 

ksnk

прохожий
Замени все таблицы на плейсхолдеры, замени, верни плейсхолдеры обратно.
Например так
 

rudoy24

Новичок
Спасибо ksnk.
А если еще и кроме <table>, и в <blockquote>...</blockquote> необходимо пропускать добавление <p>...</p>text.
То есть:
К примеру тело поиска:
-----------
<p>...</p>
<p>...</p>
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>
<blockquote><p>...</p></blockquote>
<p>...</p>

-----------


Что должно получится:
-----------
<p>...</p>text
<p>...</p>text
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>text
<blockquote><p>...</p></blockquote>
<p>...</p>text

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

AnrDaemon

Продвинутый новичок
То проще взять нормальный XML парсер и не мучаться.
 

rudoy24

Новичок
Все же необходимо доработать рабочий варинт от ksnk, а именно:
-----------------------
$xx='<p>...</p>
<p>...</p>
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>';

$mask='<<<%s>>>';
$pl=array();

$yy=preg_replace_callback(
'~<table>.*?</table>~is',
function($m) use (&$pl,$mask){
$pl[]=$m[0];
return sprintf($mask,count($pl));
},
$xx
);

$tt=preg_replace('/<\/p>/', '</p>text', $yy);

$zz=preg_replace_callback(
'~'.sprintf(preg_quote($mask,'~'),'(.*?)').'~si',
function($m) use ($pl){
return $pl[$m[1]-1];
},
$tt
);
print_r($zz);
-----------------------
 

rudoy24

Новичок
РЕШЕНО!
Возможно код громоздкий, но работает. Если есть у кого-то другие варианты, просьба поделится.
----------------------------
<?php

$xx='<p>...</p>
<p>...</p>
<table>
<tr>
<td><p>...</p></td>
<td><p>...</p></td>
</tr>
</table>
<p>...</p>
<blockquote><p>...</p></blockquote>
<p>...</p>';

$mask='<<<%s>>>';
$pl=array();

$yy=preg_replace_callback(
'~<table>.*?</table>~is',
function($m) use (&$pl,$mask){
$pl[]=$m[0];
return sprintf($mask,count($pl));
},
$xx
);

$yy=preg_replace_callback(
'~<blockquote>.*?</blockquote>~is',
function($m) use (&$pl,$mask){
$pl[]=$m[0];
return sprintf($mask,count($pl));
},
$xx
);

$tt=preg_replace('/<\/p>/', '</p>text', $yy);

$zz=preg_replace_callback(
'~'.sprintf(preg_quote($mask,'~'),'(.*?)').'~si',
function($m) use ($pl){
return $pl[$m[1]-1];
},
$tt
);
print_r($zz);

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

ra66it

Новичок
Мужчина, сейчас вы игнорируете прогресс, а однажды прогресс проигнорирует вас. Не дайте этому случаться.
 

WMix

герр M:)ller
Партнер клуба
ему это не нужно, у него задача изначально через ...
 

rudoy24

Новичок
Если есть у кого-то другие варианты, просьба поделится.
 
Сверху