2014-12-24 5 views
1

У меня есть ниже HTML текст, хранящийся в переменной $ domTextРазбор и извлечения данных из HTML текста

<TR class="tableclass"> 
    <TD>Veteran Job Information</TD> 
    <TD>9.00</TD> 
    <TD>1.2</TD> 
    <TD><INPUT type = "text" name = "notes"></TD> 
</TR> 

Я хочу, чтобы проверить, если содержание текста в первом (Здесь «Ветеран Работа ...») равна «Benefit Job», тогда необходимо сохранить значения во втором и третьем тегах (здесь 9.00 и 1.2) для переменной PHP.

Ниже я пытаюсь это сделать, но я получаю ошибки, и мой код не работает вообще. "Недействительный аргумент для Еогеаспа()"

 $dom_ChangeResults = new DOMDocument(); 
     $dom_ChangeResults->loadHTML($domText); //Load the current changes as HTML String 
     $dom_TableTags = $dom_ChangeResults->getElementsByTagName("TR"); //Check table data tags for Full time to PartTime Change 
     $rows = $dom_TableTags->item(0)->getElementsByTagName('TD'); 

     /*** loop over the table rows ***/ 
     foreach ($rows as $row) 
     { 
      /*** get each column by tag name ***/ 
      $cols = $row->getElementsByTagName('td'); 
      /*** echo the values ***/ 
      echo $cols->item(0)->nodeValue.'<br />'; 
      echo $cols->item(1)->nodeValue.'<br />'; 
      echo $cols->item(2)->nodeValue; 
      echo '<hr />'; 
     } 
+2

Из конвенции, пожалуйста, не капитализировать свои '' <*> тегов, то есть '' не '' –

+0

Спасибо за предложения. Так оно и есть в проекте. Пока что я должен использовать, так как теперь он будет фиксировать их в отдельных рабочих заказах. –

+0

Не беспокойтесь. Это ничего не влияет на простой HTML, но лучше всего следовать обычной практике: P Также, что происходит, когда вы 'var_dump ($ rows)'? –

ответ

0

Не используйте заглавные тег с PHP DOMElement. Не знаю, является ли это всем кодом, который вы нам предоставили, но капитализация в скрипте PHP является основной проблемой, getElementsByTagName('TD') вернет пустой список, где getElementsByTagName('td') вернет заполненный список.

$dom_TableTags = $dom_ChangeResults->getElementsByTagName("TR"); //Check table data tags for Full time to PartTime Change 
    $rows = $dom_TableTags->item(0)->getElementsByTagName('TD'); 

не это должно быть (или у вас есть только одна строка?):

$dom_TableTags = $dom_ChangeResults->getElementsByTagName("table"); //Check table data tags for Full time to PartTime Change 
    $rows = $dom_TableTags->item(0)->getElementsByTagName('tr'); 

хорошо here работает образец кода

$domText = <<<DOM 
     <TABLE> 
     <TR class="tableclass"> 
      <TD>Veteran Job Information</TD> 
      <TD>9.00</TD> 
      <TD>1.2</TD> 
      <TD><INPUT type = "text" name = "notes"></TD> 
     </TR> 
     <TR class="tableclass"> 
      <TD>Veteran Job Information</TD> 
      <TD>9.00</TD> 
      <TD>1.2</TD> 
      <TD><INPUT type = "text" name = "notes"></TD> 
     </TR> 
     <TR class="tableclass"> 
      <TD>Veteran Job Information</TD> 
      <TD>9.00</TD> 
      <TD>1.2</TD> 
      <TD><INPUT type = "text" name = "notes"></TD> 
     </TR> 
     </TABLE> 
DOM; 

    $dom_ChangeResults = new DOMDocument(); 
    $dom_ChangeResults->loadHTML($domText); //Load the current changes as HTML String 
    $dom_TableTags = $dom_ChangeResults->getElementsByTagName("table"); //Check table data tags for Full time to PartTime Change 
    $rows = $dom_TableTags->item(0)->getElementsByTagName('tr'); 

    /*** loop over the table rows ***/ 
    foreach ($rows as $row) 
    { 
      /*** get each column by tag name ***/ 
      $cols = $row->getElementsByTagName('td'); 
      /*** echo the values ***/ 
      echo $cols->item(0)->nodeValue.'<br />'; 
      echo $cols->item(1)->nodeValue.'<br />'; 
      echo $cols->item(2)->nodeValue; 
      echo '<hr />'; 
    } 

EDIT

Для работа с данными с одним элементом <tr>:

$dom_ChangeResults = new DOMDocument(); 
$dom_ChangeResults->loadHTML($domText); //Load the current changes as HTML String 
//$dom_TableTags = $dom_ChangeResults->getElementsByTagName("tr"); //Check table data tags for Full time to PartTime Change 
$rows = $dom_ChangeResults->getElementsByTagName('tr'); 
+0

Вы правы. Он возвращает список EMPTY. Но вы изменили мой HTML-файл. У меня нет тега TABLE в моем HTML-тексте. Можете ли вы изменить свой код, чтобы использовать текст HTML, как я писал на вопрос? ЧТОБЫ БОЛЬШЕ –

+0

@RealCoder см. Мое редактирование –

+0

Это сработало Спасибо. Я не знал, что капитализация имеет значение в PHP. Новое, что я узнал сегодня. –

0

Вы должны перебирать ваши <tr> элементов, не <td>:

$dom_ChangeResults = new DOMDocument(); 
$dom_ChangeResults->loadHTML($domText); //Load the current changes as HTML String 
$rows = $dom_ChangeResults->getElementsByTagName("tr"); 

/*** loop over the table rows ***/ 
foreach ($rows as $row) { 
    /*** get each column by tag name ***/ 
    $cols = $row->getElementsByTagName('td'); 
    /*** echo the values ***/ 
    echo $cols->item(0)->nodeValue.'<br />'; 
    echo $cols->item(1)->nodeValue.'<br />'; 
    echo $cols->item(2)->nodeValue; 
    echo '<hr />'; 
} 
+0

Если я делаю выше, $ rows на третьей строке будет содержать Nothing. SO n вообще не входя в петлю FOREACH. –

+0

@RealCoder, '$ rows' будет содержать ваш единственный элемент' '. См. Демонстрацию: http://sandbox.onlinephpfunctions.com/code/c2e120ee2ab95e5309a3061a3ab556ff42c7ae02 –

+0

Это тоже работает.Спасибо за ваш ответ. –