Как удалить <br/>
если текст не появился до или после него?
Например,
<p><br/>hello</p> <p>hello<br/></p>
они должны быть переписаны так,
<p>hello</p> <p>hello</p>
Должен ли я использовать DOMxpath или regex, было бы лучше?
(Примечание. У меня есть сообщение об удалении <p><br/></p>
с DOMxpath раньше, а затем я столкнулся с этой проблемой!)
РЕДАКТИРОВАТЬ:
Если у меня есть это на входе,
$content = '<p><br/>hello<br/>hello<br/></p>';
то это должно быть
<p>hello<br/>hello</p>'
Чтобы выбрать упомянутый бл, вы можете использовать:
"//p[node()[1][self::br]]/br[1] | //p[node()[last()][self::br]]/br[last()]"
или, возможно, быстрее:
"//p[br]/node()[self::br and (position()=1 or position()=last())]"
Просто получить br, когда первый (или последний) узел p является br.
Это выберет br, например:
<p><br/>hello</p> <p>hello<br/></p>
и первый и последний br, как в:
<p><br/>hello<br/>hello<br/></p>
не средний бр как в:
<p>hello<br/>hello</p>
PS: получить в итоге первый бр в такой паре <br/><br/>
:
"//br[following::node()[1][self::br]]"
В случае какого-то кода я мог бы заставить его работать так ( Demo ). Он имеет небольшую модификацию из xpath @ empo (очень немного) и показывает удаление совпадений, а также несколько тестовых случаев:
$html = <<<EOD <p><br/>hello</p> <p>hello<br/></p> <p>hello<br/>Chello</p> <p>hello <i>molly</i><br/></p> <p>okidoki</p> EOD; $doc = new DomDocument; $doc->loadHTML($html); $xpath = new DomXPath($doc); $nodes = $xpath->query('//p[node()[1][self::br] or node()[last()][self::br]]/br'); foreach($nodes as $node) { $node->parentNode->removeChild($node); } var_dump($doc->saveHTML());