@Shimpanze

Как обработать только текстовые узлы?

Добрый день!

Получаю все элементы на странице:

$elements = $xpath->query('*/node()');

foreach ($elements as $element) {

  if ( $element->nodeName === 'p' ) {

    // Здесь, необходимо обработать только текстовые узлы ! во всех потомках !, внутри элемента «p»
    // и вернуть элемент «p» обратно, с уже обработанными текстовыми узлами

  }
  else {
    echo $element->C14N();
  }
}


Подскажите, пожалуйста, как обработать только текстовое содержимое параграфов, а так же текстовое содержимое всех их потомков, (в них могут быть теги span или a и т. д.)?

Пример:

Было:
<p>Ехал <span>Грека</span> через <a href="#">реку</a></p>


Стало:
<p>ЕХАЛ <span>ГРЕКА</span> ЧЕРЕЗ <a href="#">РЕКУ</a>


У меня получается сделать только вот так: echo strtoupper( $element->C14N() )
...тогда на выходе все становится заглавными буквами. Вот так:

<P>ЕХАЛ <SPAN>ГРЕКА</SPAN> ЧЕРЕЗ <A HREF="#">РЕКУ</A></P>


Как обработать только все дочерние узлы?

P. S. Приведение к верхнему регистру, приведено для примера. С текстовыми узлами, будет проводиться обработка другого плана.
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
egor_nullptr
@egor_nullptr
$text = '<p>Ехал <span>Грека</span> через <a href="#">реку</a></p> а это не изменится';

$doc = new DomDocument('1.0', 'utf-8');
$doc->loadXML('<?xml version="1.0" encoding="utf-8"?><body>' . $text . '</body>');
$xpath = new DomXPath($doc);

$elements = $xpath->query('//p//text()');

foreach ($elements as $tn) {
    $tn->nodeValue = mb_strtoupper($tn->nodeValue);
}

echo mb_substr($doc->saveXML($doc->getElementsByTagName('body')->item(0)), 6, -7);

/* На выходе:
 * <p>ЕХАЛ <span>ГРЕКА</span> ЧЕРЕЗ <a href="#">РЕКУ</a></p> а это не изменится
 */
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
1. Регулярные выражения https://regex101.com/
2. Делать на стороне js
Ответ написан
Комментировать
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
А в чем проблема если html теги будут заглавными?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы