eregi_replace 2 level pattern

dialup111

Guest
eregi_replace 2 level pattern

есть строка:
$string = "ert<br>eeee<br><pre>This is a test<br>fgdfgd<br>eeee</pre>";
Надо убрать все <br> между тэгами <pre> и </pre>
Никак не могу понять как эти паттерны составлять, вот поглядите чего получилось:

<?
$string = "ert<br>eeee<br><pre>This is a test<br>fgdfgd<br>eeee</pre>";

echo eregi_replace ("<pre>(( )<br>)<\/pre>", "\\2", $string);
?>

Как надо правильно это сделать ?
 

dialup111

Guest
Originally posted by sakon
(( )<br> ) - что это должно означать?
Так вот тут то я и не знаю, я смотрел манул по PHP, где вот такой пример замутили:
Example 1. ereg_replace() Example

$string = "This is a test";
echo ereg_replace (" is", " was", $string);
echo ereg_replace ("( )is", "\\1was", $string);
echo ereg_replace ("(( )is)", "\\2was", $string);

вот по аналогии и пытаюсь что-то сделать.

Страницу "Pattern Syntax" тоже читал, но мне там ничего не понятно - там примеров нет.

Помогите !!!

-~{}~ 16.02.05 22:18:

В рамках той же темы продолжаю копать:
Пишу:
<?
$string = "This is a test<b>font";
echo ereg_replace ("(( )a)", "\\2=-=", $string);
?>

Получаю HTML код:
This is =-= test<b>font

Пишу:
<?
$string = "This is a test<b>font";
echo ereg_replace ("(( )font)", "\\2=-=", $string);
?>

Получаю HTML код:
This is a test<b>font

А должен бы получить HTML код:
This is a test<b>=-=

ПОЧЕМУ НЕ ПОЛУЧАЕТСЯ ТАК КАК ДОЛЖНО БЫТЬ ?
 

dialup111

Guest
Originally posted by sakon
потому, что не обращаешь внимания на ссылки которые тебе дают.
пардон, не заметил. То ли ты пост свой правил, то ли я увлёкся. Спасибо, буду дальше разбираться.
 

sakon

П..и.н..ок
(IMHO) Возможно тебе прдется решать эту задачу в 3 приема:
1. получить данные между тегами <pre></pre>
2. сделать замену в полученой строке
3. вставить измененные данные обратно.
 

dialup111

Guest
Originally posted by sakon
(IMHO) Возможно тебе прдется решать эту задачу в 3 приема:
1. получить данные между тегами <pre></pre>
2. сделать замену в полученой строке
3. вставить измененные данные обратно.
Да, хитрожопую задачу я себе сам придумал... и обломался.

===
Сидел я сидел над этим 5 часов, так в итоге ничего у меня и не получилось :( Наверное это задача для гуру, так что если поможете написать реализацию - буду благодарен, а если нет, то буду как умею - на цикле всё это дело писать. А вообще просто обидно очень, я ведь отнюдь не тупой человек.
 

uchenik

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

PHP:
function func($bloc)
{
  return preg_replace("/<br>/si", "", $bloc[1]);
}

$text = preg_replace_callback("/(<pre>.*?<\/pre>)/si", "func", $text);

echo $text;
1. Функция preg_replace_callback() перебирает строку $text и находит в ней подстроку "<pre>текст....</pre>", где нужно провести замену.
2. Затем вызывается пользовательская функция func(), которой в качестве параметра передается найденная подстрока "<pre>текст....</pre>".
3. Функция func() вырезает из найденной подстроки все теги "<br>" и возвращает уже "почищенную" подстроку.
4. И так повторяется пока функция preg_replace_callback() не переберет всю строку $text.

Вообщем таким образом решается поставленная задача. Вариант конечно не единственный, но очень простой.

preg_replace_callback()
 

dialup111

Guest
Спасибо, uchenik, удружил. А я то наивно рассчитывал вчера на одной лишь функции preg_replace или ereg_replace это всё решить. Но максимум, чего удалось добиться, что только один <br> из блока <pre></pre> вырезался, а это конечно ничего не давало, так как в общем случае между <pre> и </pre> у меня может быть хоть 1000 этих <br>.
Кстати, не хочу, очернять статьи про регулярные выражения, но всё же они несколько "умные", лучше бы нечто вроде "Регулярные выражения для чайников :) на примерах".

Ещё раз всем спасибо, вопрос закрыт.
 

vazgen

Guest
uchenik

и от меня тебе спасибо
штука не из легких
 
Сверху