Как заменить только строку из содержимого html в php - PullRequest
0 голосов
/ 04 февраля 2020

Как заменить только строку из содержимого html в php?

Пример: Html:

<div>
    <a class="active" href="link">My String</a>
</div>

<div>
    <ul>
        <li><i fa fa-list></i>List 1</li>
        <li><i fa fa-list></i>List 2</li>
    </ul>
</div>

Исключенный результат:

<div>
    <a class="active" href="link">My Replace String</a>
</div>

<div>
    <ul>
        <li><i fa fa-list></i>List 1</li>
        <li><i fa fa-list></i>Replace List 2</li>
    </ul>
</div>

Цель этого состоит в том, чтобы перевести только строку и заменить ее в html контенте.

Попробуйте: я пробовал dom, но не закрывал правильные теги

    libxml_use_internal_errors(true);
    $dom = new \DOMDocument();
    $dom->loadHTML($language_value, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    $xpath = new \DOMXPath($dom);
    /*echo $language_value.'<br>.........';*/
    foreach($xpath->query('//text()') as $text)
    {
        if (trim($text->nodeValue)) {
            $search = $text->nodeValue;
            /*echo $text->nodeValue.'<br>';*/

            $text->nodeValue = $tr->translate($source, $code, $text->nodeValue, $attempts);
            /*$text->nodeValue = str_replace($search,$replace,$text->nodeValue);*/
            /*echo $text->nodeValue.'<br>';*/
        }
    }
    $result = $dom->saveHTML();

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020
libxml_use_internal_errors(true);

Я бы не рекомендовал его, поскольку он подавлял бы ошибки, которые выдает lib xml. Вы действительно хотите проверить, правильно ли сформирован HTML или нет (или это действительно текст HTML).

В вашем случае вы можете использовать getElementsByTagName , чтобы получить все теги li. Теперь вы можете l oop на все соответствующие li элементы и редактировать только элемент, который появляется в вашем списке 2 и , так как вы хотите редактировать только 2 nd li element.

Однако при этом у вас есть дочерний узел и текстовый узел (имеющий текст List 2). Вы можете редактировать только текстовый узел и оставить все остальные узлы как есть.

Фрагмент:

<?php


$dom = new DOMDocument();
$dom->loadHTML('
<div><a class="active" href="link">My String</a></div> 
<div>
<ul>
<li><i class="fa fa-list"></i>List 1</li>
<li><i class="fa fa-list"></i>List 2</li>
</ul>
</div>');

foreach($dom->getElementsByTagName('li') as $index => $node){
    if($index === 1){ // to skip first li tag(since you want the 2nd one)
        foreach($node->childNodes as $child_node){
            if($child_node instanceof DOMText){
                $child_node->nodeValue = 'Replacement List 2';
                break;
            }
        }
    }
}

echo $dom->saveHTML();

Демонстрация: https://3v4l.org/plPa6

Важное замечание здесь DOMDocument добавил теги DOCTYPE, html и body также к вашим HTML, поскольку ваши начальные HTML не были должным образом структурированы в иерархической структуре.

0 голосов
/ 04 февраля 2020

Сначала ваша HTML строка должна быть valid HTML

Затем вы можете использовать $node->nodeValue, чтобы установить текст для замены

//...

$domString = "
<div><a class='active' href='link'>My String</a></div> 
<div>
  <ul>
    <li><i class='fa fa-list'></i>List 1 </li>
    <li><i class='fa fa-list'></i>List 2 </li>
  </ul>
</div>";
$dom = new \DOMDocument;
@$dom->loadHTML($domString, LIBXML_HTML_NODEFDTD);

$xPath = new \DOMXPath($dom);


foreach($xPath->query("//a") as $node) {
    $node->nodeValue = "My replacement string";
}

foreach($xPath->query("//li") as $node) {
    $node->nodeValue = "My replacement list";
}

$result = $dom->saveHTML();
//...

Проверить демонстрацию Repl здесь

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