специфика замены подстроки в строке функцией php

в тексте я хотел бы заменить ДИВ тег литий. Но не все просто точно определены. В этом случае те, у которых есть id, начинающийся с «tab — *», мне нужно что-то легко используя функции PHP из текста:

<div id="tab-141285" class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</div>
<div id="tab-85429"  class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</div>

получить этот текст

<li id="tab-141285" class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</li>
<li id="tab-85429"  class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</li>

Можете ли вы посоветовать мне?

Спасибо

0

Решение

Регулярные выражения не подходят для анализа HTML. Любое регулярное выражение, которое вы пытаетесь использовать, будет хрупким. Я предлагаю использовать Расширение DOM вместо этого.

Идея состоит в том, чтобы:

  1. Найти все <div> элементы, которые имеют id атрибут, который начинается с "tab-" с использованием XPath запрос //div[starts-with(@id, "tab-")]
  2. Создайте новый <li> элемент для каждого из них.
  3. Переместить все <div>атрибуты и дочерние узлы к новому <li> элемент.
  4. Замени старое <div> с новым <li>,

Поскольку ваша строка не имеет корневого элемента, мы немного потанцуем до и после, чтобы поместить ее в один, а затем перестроить.


Пример:

$html = <<<'HTML'
<div id="tab-141285" class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</div>
<div id="tab-85429"  class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML("<div>$html</div>", LIBXML_HTML_NOIMPLIED);
$xpath = new DOMXPath($dom);

$nodes = $xpath->query('//div[starts-with(@id, "tab-")]');

foreach ($nodes as $node) {
$li = $dom->createElement('li');

while ($node->attributes->length) {
$li->setAttributeNode($node->attributes->item(0));
}
while ($node->firstChild) {
$li->appendChild($node->firstChild);
}

$node->parentNode->replaceChild($li, $node);
}

$html = '';
foreach ($dom->documentElement->childNodes as $node) {
$html .= $dom->saveHTML($node);
}

echo $html;

Выход:

<li id="tab-141285" class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</li>
<li id="tab-85429" class="my-class">
<div class="my-subclass">
<div>
Lorem ipsum dolor sit amet consectetuer
</div>
</div>
</li>
1

Другие решения

используйте domdocument xml-компонент php, просто загрузите строку в объект domdocument и найдите элемент, затем получите его атрибут, проверьте его идентификатор и сравните, используя preg_replace, и удалите, если он соответствует вашему условию

0

По вопросам рекламы [email protected]