php поиск и замена Н-го вхождения

M
На сайте с 20.08.2004
Offline
376
1917

Подскажите как заменить, например 3, вхождение определенного тега (<p>)?

Спасибо

Miracle добавил 09.08.2011 в 10:52

А еще было бы идеально поиск и замена "с конца"!

отец сыночка, лапочки дочки и еще одного сыночка
D
На сайте с 09.07.2009
Offline
79
#1

$beg="fjrnhfjh<p>fcjkn</p>ffv<p>fvgbghnhjm</p>gbgb<p>dfvfbgf</p>gbgngm";

$res=preg_replace("/(<p>.*?<\/p>).*?$/Ui", "tothis", $beg);

echo $res;

Может как-то так..

gormarket
На сайте с 29.12.2010
Offline
47
#2

Обратите внимание на синтаксис preg_replace (четвертый параметр)


Функция preg_replace()
Синтаксис:

mixed preg_replace (mixed pattern, mixed replacement, mixed subject [, int limit])

Эта функция позволит вам произвести замену текста по регулярному выражению. Здесь производится поиск по регулярному выражению pattern в тексте subject, и каждый найденный фрагмент текста заменяется на текст, заданный в replacement. Задание необязятельного параметра limit позволит ограничить количество заменяемых фрагментов в тексте.
Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
D
На сайте с 09.07.2009
Offline
79
#3

Вот так:

в $n какой по счёту нужно заменять.

<?php

$beg="fjrnhfjh<p>fcjkn</p>ffv<p>fvgbghnhjm</p>gbgb<p>dfvfbgf</p>gbgngm";

preg_match_all("/(<p>.*?<\/p>)/is", $beg, $regs);

$n=3;

$res = str_replace($regs[0][$n-1], "tothis", $beg);

echo $res;

?>

M
На сайте с 20.08.2004
Offline
376
#4

спасибо

gormarket:
ограничить количество заменяемых фрагментов в тексте

я это читал.

digwnews:
в $n какой по счёту нужно заменять.

я все же надеялся что есть решение проще ))

C
На сайте с 20.05.2011
Offline
14
#5

ну квантификатор кратности например? (если я правильно понял, что нужно - заменить указанное кол-во подряд идущих тэгов чем-то одним)


<?php
$in_str = "anonymous text node<p>first text node</p><p>second text node</p><p>third text node</p>some other txt node<p>this one mustn't be replaced</p>yet another text node";
echo preg_replace("/(<p>.*?<\/p>){3}/is", 'replace with', $in_str);
?>

(<p>.*?<\/p>){3} - ровно 3

(<p>.*?<\/p>){3,} - 3 и более

(<p>.*?<\/p>){,3} - не более трёх и т.д.

gormarket
На сайте с 29.12.2010
Offline
47
#6
cryptex:
(<p>.*?<\/p>){3} - ровно 3

cryptex, для приведенного Вами примера это работает (проверил)

но вот (<p>.*?<\/p>){4} уже "не прокатывает" - нет в примере четырех подряд идущих "<p>.*</p>" "не разбавленных" другим текстом (между третьим и четвертым параграфом простой текст).

А вообще здорово! не ожидал что квантизатор работает с подстрокой!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий