2014-12-31 2 views
1

это пример кода:PHP Simple DOM Parser первый ребенок

<div class="content"> 
<p>text 1</p> 
<p>text 2</p> 
<p>text 3</p> 
<table border="1" cellpadding="0" cellspacing="0" dir="ltr"> 
    <tbody> 
     <tr> 
      <td valign="top" width="205"> 
       <p>td1</p> 
      </td> 
      <td valign="top" width="205"> 
       <p>td2</p> 
      </td> 
      <td valign="top" width="205"> 
       <p>td3</p> 
      </td> 
     </tr> 
    </tbody> 
</table> 
</div> 

Я хочу, чтобы распечатать только первый уровень р пункт

Так что попробуйте этот код:

foreach($html->find('div.content p') as $p) 
{ 
    echo $p->plaintext; 
    echo "<br/>"; 
} 

Я ожидаю, что они результат:

text 1 
text 2 
text 3 

Но я получите следующие данные:

text 1 
text 2 
text 3 
td1 
td2 
td3 

Есть ли способ игнорировать другие теги p?

+1

Я не знаю, как далеко PHP Simple DOM Parser следует за css, но я бы попробовал '$ html-> find ('div.content> p')', чтобы получить прямых детей. – jeroen

ответ

2

Если селекторы такие же, как в CSS селектор вы ищете

foreach($html->find('div.content > p') as $p) { 
    //       ^^ 
    ... 
} 

Используя эти селекторы вы найдете прямые детей, ваш .content p найти все p в .content, а не только прямые ребенок ,

+0

Это не работа. mybe, вы правда ... потому что p находится в таблице> tbody> tr> td> P, так что это первый P! –

+0

Вы не хотите, чтобы первый P-ребенок ('p: first-child', который возвращает' text 1' и 'td 1'), но прямое дочерние элементы' div.content', которые являются в точности тремя абзацами с ' текст 1-3'. Он должен работать. Селектор, который вы пишете в комментарии выше, если все в порядке, но вам это нужно? Не уверен, абзацы в TDs не имеют значения, не так ли? – panther

+0

Да, я не хочу абзацев в TDs, но я тестирую этот код, и результат такой же, как и код в моем вопросе ... –

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