Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > удаление значения между тегами


Автор: derek 7.6.2009, 23:09
Допустим на вход подается такой текст

"text1
text2
text3

<b>boldtext1</b>
<b>boldtext2</b>
<b>boldtext3</b>


text4
text5"

необходимо удалить весь текст с тегами <b> (и сами теги тоже). Я делаю так. Ищу текст между тегами - заменяю его в тексте на пустой, а потом удаляю сами теги.


Код


function get_between ($text, $s1, $s2) {
$mid_url = "";
$pos_s = strpos($text,$s1);
$pos_e = strpos($text,$s2);
for ( $i=$pos_s+strlen($s1) ; (( $i<($pos_e)) && $i <strlen($text)) ; $i++ ) {
$mid_url .= $text[$i];
}
return $mid_url;
}

for ($i=0;$i<=3;$i++)
    {

    $textintags=get_between($testhtmldata,"<b>","</b>");
    $indata=str_replace($textintags,"",$indata);

    }
    
$indata=str_replace("<b>","",$indata);
$indata=str_replace("</b>","",$indata);



но код работает некорректно - убирает только содержимое первого тега, т.е. в нашем случае только boldtext1. Теги убирает везде. в чем ошибка понять не могу.

может вообще есть способ по-проще?

спасибо


Автор: enof 7.6.2009, 23:18
Код

$str = preg_replace("#<b>.*</b>#Us", "", $str);

Автор: derek 7.6.2009, 23:43
вообще, понятно что надо использовать регулярки - одна строчка кода против 20
но просто здесь я немного абстрагировал свою задачу, в моем варианте фраза в тексте выглядит примерно так

{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}привет{<span style=\"background-color: #c0c0c0;\">{/ТЯЖ.ПОЛ}</span>}

реально ли написать регулярку к таким "тегам"?



ну и все же, что было нет так в моем коде изначально?


Автор: derek 9.6.2009, 02:27
что-то я мучаюсь и не выходит. вообще реально получится подогнать регулярку под такой формат "тегов"?


{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}привет{<span style=\"background-color: #c0c0c0;\">{/ТЯЖ.ПОЛ}</span>}

Автор: Sentox 9.6.2009, 07:03

Код

$str = preg_replace("#<span.*</span>#Us", "", $str);

Автор: derek 10.6.2009, 12:02
Sentox
"тег" в моем случае вот это это "{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}".
Просто для <span> регулярку не проблема написать, да.

Автор: derek 12.6.2009, 12:42
ребят ну я что-то все никак не осилю  smile  smile 
 smile 

Автор: enof 12.6.2009, 12:55
\{<span.*</span>\}

Автор: derek 12.6.2009, 23:01
enof, спасибо!
но тут уже опять my bad.
я уже писал что это целый тег
"{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}".

может быть еще например такой тег
"{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}".

т.е. важно что находится между span'ов.

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

Автор: derek 13.6.2009, 08:57
напишу еще раз на всякий случай. у меня может быть такой входной текст

"
{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}hello{<span style=\"background-color: #c0c0c0;\">{/ТЯЖ.ПОЛ}</span>}

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

"

нужно написать такие регулярки чтобы осталось

"
hello

world
"

заранее огромное спасибо!

Автор: enof 13.6.2009, 18:23
Не поверишь, но регулярка так и работает.

Автор: derek 13.6.2009, 18:51
enof, ок, а что делать если из такой входной строки
"
{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}hello{<span style=\"background-color: #c0c0c0;\">{/ТЯЖ.ПОЛ}</span>}

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

"

нужно получить такую?

"
hello

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

"

одной единственной универсальой регуляркой в таком случае не справишься

Автор: enof 13.6.2009, 20:46
А словами описать, что нужно, никак? Или по-вашему легко догадаться по этому:

Цитата(derek @  13.6.2009,  19:51 Найти цитируемый пост)
"
{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}hello{<span style=\"background-color: #c0c0c0;\">{/ТЯЖ.ПОЛ}</span>}

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

"

нужно получить такую?

"
hello

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

?

Автор: derek 13.6.2009, 21:16
enof
ну я и пытаюсь несколько постов сказать что регулярка должна полностью соответствовать "тегу". Тегов может быть несколько, причем не обязательно нужно убирать все сразу - для каждого отдельного тега должна быть своя регулярка

еще раз, есть такая входная строка (теги выделены жирным)

"
{<span style=\"background-color: #c0c0c0;\">{ТЯЖ.ПОЛ}</span>}hello{<span style=\"background-color: #c0c0c0;\">{/ТЯЖ.ПОЛ}</span>}

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

"
необходимо написать регулярку для удаления тегов вокруг слова hello
чтобы в результате получилась строка

"
hello

{<span style=\"background-color: #c0c0c0;\">{ЛЕГ.ПОЛ}</span>}world{<span style=\"background-color: #c0c0c0;\">{/ЛЕГ.ПОЛ}</span>}

"

Автор: derek 13.6.2009, 23:16
пробую так

Код

$teststring=preg_replace("\{<span style\=\"background\-color\: \#c0c0c0\;\">\{ТЯЖ\.ПОЛ\}<\/span>\}.*\{<span style\=\"background\-color\: \#c0c0c0\;\">\{\/ТЯЖ\.ПОЛ\}<\/span>\}","",$teststring);


вываливается с ошибкой
Delimiter must not be alphanumeric or backslash

Добавлено через 9 минут и 46 секунд
разобрался, необходимо было заключить регулярку в слеши.
спасибо всем за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)