Простой HTML DOM - заменить все вхождения определенного слова - не влияя на атрибуты

1

Мне было интересно: как я могу изменить все вхождения определенного слова в HTML, но только вне тегов?

Пример: Предположим, что я хочу заменить все вхождения myWordToReplace на <a href="#">myWordToReplace</a>

Итак, этот html

<p data-something="myWordToReplace"> myWordToReplace andSomeOtherText</p>

должен уступить

<p data-something="myWordToReplace"> <a href="#">myWordToReplace</a> andSomeOtherText</p>

Я пытался добиться этого с помощью регулярного выражения, но это тоже беспорядок - я думал, возможно, парсер DOM сделал бы трюк? Любая помощь ценится?

EDIT: ответ @Muhammet сделает трюк, если весь текст будет обернут в некоторые теги, но если части вашего текста без тега, этот текст не будет заменен, конечно. Я тоже пытаюсь это сделать.

Пример: если я хочу изменить myWord на someOtherWord:

Nam myWord pharetra <strong>auctor myWord</strong>

Должна

Nam someOtherWord pharetra <strong>auctor someOtherWord </strong>

но теперь он меняет только второе слово - одно внутри сильных тегов.

  • 0
    Почему понизить, пожалуйста? :)
  • 0
    Это не тривиальная вещь. Я бы рекомендовал не использовать здесь подход регулярных выражений, так как это было бы огромным усилием. Для этого вам понадобится конечный автомат, и довольно сложный .... Взгляните на DOM-анализатор, итерируйте по элементам, а затем используйте регулярное выражение для замены шаблонов внутри содержимого каждого элемента.
Показать ещё 5 комментариев
Теги:
simple-html-dom

3 ответа

2
Лучший ответ

Вы могли бы сделать что-то вроде этого

$html = file_get_html($file_url);
$content = $html->find('text');

foreach($content as $line) {
    if(strpos($line->innertext, 'myWordToReplace') !== false) {
        $line->innertext = str_replace('myWordToReplace','<a href="#">myWordToReplace</a>', $line->innertext);
    }
}
  • 1
    Да, это именно то , что я предложил в комментариях выше.
  • 0
    Так ты идешь построчно? Почему бы вам не использовать метод «найти», чтобы на самом деле искать то, что вам нужно?
Показать ещё 10 комментариев
1

Вот еще одно DOM-решение для обертывания частей текстовых узлов в теги <a> (с использованием search в качестве образца):

$html = "<html><body>\n<!-- This is a comment for search //-->\n<span class=\"search\">New search performed</span></body></html>";
$key = "search";
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$tt = $xpath->query('//text()');

foreach ($xpath->query('//text()') as $textNode) {
    $fragment = $dom->createDocumentFragment();
    $text = $textNode->nodeValue;

    while (($pos = stripos($text, $key)) !== false) {
      $fragment->appendChild(new DOMText(substr($text, 0, $pos)));
      $word = substr($text, $pos, strlen($key));

      $lnk = $dom->createElement('a');
      $lnk->appendChild(new DOMText($word));
      $lnk->setAttribute('href', '#');
      $fragment->appendChild($lnk);

      $text = substr($text, $pos + strlen($key));
    }
    if (!empty($text))
      $fragment->appendChild(new DOMText($text));
    $textNode->parentNode->replaceChild($fragment, $textNode);
}
echo $dom->saveHTML();

Вот демоверсия IDEONE

0

Это отлично работает для меня. Я не знаю, почему он не принимает "данные-что-то", кажется, что ему не нравится тире между двумя словами. Но поскольку это работает, я надеюсь, что это будет полезно для вас.

Я использую Simple HTML DOM Library

$my_html = '<p data="myWordToReplace"> myWordToReplace </p>';
$html = str_get_html($my_html);

foreach($html->find('p') as $p) {
    if (!empty($p->data) && ($p->data == 'myWordToReplace')) {
        $p->innertext = '<a href="#">'. $p->innertext .'</a>';
    }
}

echo $html; 
  • 1
    Допустим, я хочу заменить все вхождения Почему вы думаете, что это только p ? Почему вы думаете, что это только p data == 'myWordToReplace' ? Как вы думаете, почему текст содержит только myWordToReplace ?
  • 0
    потому что это пример, который выставил @trainoasis, он ищет его. Сохраните его в переменной и введите все, что хотите, укажите идентификатор элемента, который вы хотите найти, или объясните вопрос немного лучше.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню