Есть текст:
<hr class="h1"><sftxt>Hello World!</sftxt><hr class="h1">
Так же есть текст:
<hr class="h1"><bxtwt>Hello World!</bxtwt><hr class="h1">
Как можно удалить тэг <hr class="h1"> из текста приведенного выше? Причем только если рядом с этим тэгом идет тэг <sftxt> или </bxtwt> или <bxtwt> или </sftxt>
ибо если текст имеет другой формат, допустим
<hr class="h1"><div class="text">qwerty</div>123456<br><hr class="h1">
то тогда в этом случае <hr class="h1"> мы не трогаем
я бы советовал использовать класс simple_dom_html_parser php, сделать селектор типа
foreach($html->find('hr.h1') as $elem) {
// здесь ищем в $elem теги из задачи
// ...
// при необходимости удаляем
// ...
}//foreach($html->find('hr.h1') as $elem)
Если интересует решение на чистых регулярках, то вот один из вариантов:
$string = '
<hr class="h1"><sftxt>Hello World!</sftxt><hr class="h1">
<hr class="h1"><bxtwt>Hello World!</bxtwt><hr class="h1">
<hr class="h1"><div class="text">qwerty</div>123456<br><hr class="h1">
';
$pattern = '~
(?:<hr[^>]*>(?=(?:<sftxt>|<bxtwt>))|
(?<=(?:</sftxt>|</bxtwt>))<hr[^>]*>)
~x';
echo preg_replace($pattern, '', $string);
/* Результат:
<sftxt>Hello World!</sftxt>
<bxtwt>Hello World!</bxtwt>
<hr class="h1"><div class="text">qwerty</div>123456<br><hr class="h1">
*/
Вот решение в лоб:
$text = '<hr class="h1"><sftxt>Hello World!</sftxt><hr class="h1">';
$text = preg_replace('/<hr class=\"h1\">\$*(?=<sftxt>|<bxtwt>|<\/sftxt>|<\/bxtwt>)/', '', $text);
echo preg_replace('/(?<=<sftxt>|<bxtwt>|<\/sftxt>|<\/bxtwt>)\$*<hr class=\"h1\">/', '', $text);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей