Как получить текст из элемента, исключая некоторые другие элементы внутри этого

Я использую domCrawler в фреймворке symfony. Я просканировал содержимое из html, используя его. Теперь мне нужно получить текст внутри элемента с идентификатором. Я могу исправить текст, используя приведенный ниже код:

$nodeValues = $crawler1->filter('#idOfTheElement')->each(function (Crawler $node, $i) {
            return $node->text();
        });

Элемент (#idOfTheElement) содержит несколько промежутков, кнопок и т. д. (те, которые также имеют некоторые классы). Мне не нужно содержимое внутри них. Как получить текст из элемента, исключая некоторые другие элементы внутри него.

Примечание. Текст, который я хотел получить, не имеет никакой другой оболочки, кроме элемента #idOfTheElement.

Html выглядит следующим образом:

<li id='#idOfTheElement'>Tel :<button data-pjtooltip="{dtanchor:'tooltipOpposeMkt'}" class="noMkt JS_PJ" type="button">text :</button><dl><dt><a name="tooltipOpposeMkt"></a></dt><dd><div class="wrapper"><p><strong>Signification des pictogrammes</strong></p><p>Devant un numéro, le picto <img width="11" height="9" alt="" src="something"> signale une opposition aux opérations de marketing direct.</p><span class="arrow">&nbsp;</span></div></dd></dl>12 23 45 88 99</li>

person arun    schedule 06.05.2015    source источник


Ответы (2)


Вы можете получить html элемента, а затем избавиться от тегов

preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $node->html());
person Konstantin Pereiaslov    schedule 06.05.2015
comment
Элементы внутри тех, у которых также есть тексты, я не хочу ничего из этого. В таком случае это не сработает - person arun; 07.05.2015
comment
Это должно удалить текст внутри этих элементов. Можете ли вы привести пример HTML? - person Konstantin Pereiaslov; 08.05.2015
comment
‹li id='#idOfTheElement'›Тел :‹button data-pjtooltip={dtanchor:'tooltipOpposeMkt'} class=noMkt JS_PJ type=button›text :‹/button›‹dl›‹dt›‹a name=tooltipOpposeMkt› ‹/a›‹/dt›‹dd›‹div class=wrapper›‹p›‹strong›Значение пиктограмм‹/strong›‹/p›‹p›Devant un numéro, le picto ‹img width=11 height= 9 alt= src=something› signale une Opérations aux Operations de Marketing Direct.‹/p›‹span class=arrow›‹/span›‹/div›‹/dd›‹/dl›12 23 45 88 99‹/li › - person arun; 08.05.2015
comment
@nu6a Это недопустимый HTML, есть закрывающий </button>, но не открывающий, поэтому мое регулярное выражение выводит для него text :</button>12 23 45 88 99, но для действительного HTML оно должно работать. Однако, если у вас есть недопустимый HTML-код, возможно, для начала пропустите его через HTMLPurifier? - person Konstantin Pereiaslov; 08.05.2015
comment
Ответ работает для меня сейчас. Но я хотел бы знать, есть ли какие-либо селекторы, такие как not в domcrawler - person arun; 11.05.2015

Сначала удалите дочерние узлы:

$crawler1->filter('#idOfTheElement')->each(function (Crawler $crawler) {
        foreach ($crawler as $node) {
            $node->parentNode->removeChild($node);
        }
    });

Затем получите текст без дочерних узлов:

$cleanContent = $crawler1->filter('#idOfTheElement')->text();
person leealex    schedule 20.09.2017