2015-11-18 7 views
2

Учитывая следующий HTML фрагмент кода:Самый эффективный/лучший способ извлечь текстовое значение из тега HTML, используя Symfony DOM Crawler?

<div class="item"> 
    large 
    <span class="some-class">size</span> 
</div> 

Я ищу лучший способ извлечь строку «большой» с помощью Crawler Symfony в.

$crawler = new Crawler($html); 

Здесь я мог бы использовать $crawler->html() затем применить поиск регулярных выражений. Есть ли лучшее решение? Или как бы вы это сделали?

ответ

4

Я только что нашел решение, которое выглядит чистейшая мне:

$crawler = new Crawler($html); 
$result = $crawler->filterXPath('//text()')->text(); 
+1

Смешное решение! :) Это действительно работает. – COil

+1

'$ result = $ crawler-> filterXPath ('// div [@ class =" item "]/text()') -> text();' будет лучше. – COil

+0

Я думаю, что нам действительно не нужен этот дополнительный селектор, поскольку узел div.item уже выбран, потому что это корневой узел – haxpanel

0
$crawler = new Crawler($html); 
$node = $crawler->filterXPath('//div[@class="item"]'); 
$domElement = $node->getNode(0); 
foreach ($node->children() as $child) { 
    $domElement->removeChild($child); 
} 
dump($node->text()); die(); 

После того, как вы должны обрезать пробелы.

0

Это немного сложно, как текст, который вы пытаетесь получить текстовый узел, что DOMCrawler компонент Безразлично» t (насколько я знаю) позволяет вам извлекать. К счастью DOMCrawler только слой поверх классов DOM PHP, который означает, что вы могли бы, вероятно, сделать что-то вроде:

$crawler = new Crawler($html); 
$crawler = $crawler->filterXPath('//div[@class="item"]'); 
$domNode = $crawler->getNode(0); 
$text = null; 

foreach ($domNode->children as $domChild) { 
    if ($domChild instanceof \DOMText) { 
     $text = $domChild->wholeText; 
     break; 
    } 
} 

Это не помогло бы с HTML, как:

<div> 
    text 
    <span>hello</span> 
    other text 
</div> 

Таким образом, вы бы только получить «текст», а не «текст другого текста» в этом случае. Взгляните на документацию DOMText для более подробной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^