Я использую PHP Simple HTML DOM Parser для своего проекта.
Я пытаюсь найти конкретные данные и повторить их после того, как я проанализирую мой .php-файл с веб-сайта URL, который содержит данные внутри элемента таблицы HTML, например:
<table class="example"> <tbody> <tr> <td> Heading #1 <p>Description of heading #1 here ...</p> </td> <td>Example of data #1</td> </tr> <tr> <td> Heading #2 <p>Description of heading #2 here ...</p> </td> <td>Example of data #2</td> </tr> </tbody> </table>
Мой вопрос:
Как я могу получить значение «Пример данных № 1» из второго элемента ячейки TD в первом элементе строки TR, зная, что первая ячейка TD в той же строке TR содержит значение «Заголовок №1 …» из этого типа Таблица?
Я проанализировал URL, теперь мне нужно найти значение, основанное на другом значении, которое рядом с ним.
Должен ли я использовать некоторое регулярное выражение и сделать для этого некоторый шаблон? strpos () и массив?
Вам нужно будет предоставить подразделениям таблиц идентификатор для JavaScript, чтобы иметь возможность получать данные для отправки и помещать их в скрытые входы с именами и идентификаторами, чтобы PHP получал их с помощью POST.
<script language="javascript"> function transfer_data(){ documentGetElementById('ex1_hidden').value = documentGetElementById('ex1').innerHTML; documentGetElementById('ex2_hidden').value = documentGetElementById('ex2').innerHTML; submit(); } </script> <table class="example"> <tbody> <tr> <td id="hdg1"> Heading #1 <p>Description of heading #1 here ...</p> </td> <td id="ex1">Example of data #1</td> </tr> <tr> <td> Heading #2 <p>Description of heading #2 here ...</p> </td> <td id="ex2">Example of data #2</td> </tr> </tbody> </table>
В вашей форме, которая отправляется туда, куда вы хотите, используя method="post"
вам понадобится:
<input type="hidden" name="ex1_hidden" id="ex1_hidden" /> <input type="hidden" name="ex2_hidden" id="ex2_hidden" /> <input type="button" value="Submit" onClick="transfer_data()" />
В PHP вы получите их с помощью $_POST['ex1_hidden']
и $_POST['ex2_hidden']
(не забудьте очистить поданные данные).
Это не метод, который подходит для защищенных данных.
Вы можете добавить идентификатор в заголовок и сделать его условным в своем скрипте:
if(documentGetElementById('hdg1').innerHTML == "Heading #1"){ documentGetElementById('ex1_hidden').value = documentGetElementById('ex1').innerHTML; }
Возможно, вам придется обрезать пробел с заголовка, возможно, используя что-то вроде
var str=documentGetElementById('hdg1').innerHTML.replace(/^\s+|\s+$/g,'');
Credit @Paul о том, как мне удалить пробел при захвате текста с помощью jQuery?
Много полезных идей по другим способам здесь Как получить значение ячейки таблицы с помощью jQuery?
Если это очищенные данные с другого сайта, на котором у вас нет контроля вообще, но который у вас уже есть в переменной PHP, вы можете explode()
его на <td>
и определить, какие позиции в массиве содержат нужные вам данные , Ссылка: http://php.net/manual/en/function.explode.php
Это то, что я думаю, что вы действительно ищете – может быть хорошей идеей спросить владельца сайта, если он в порядке, но это зависит от вас. Вы были на правильном пути с strpos();
и массивы (проверены с использованием таблицы):
// only works if fopen is allowed on the site's server and in PHP5+ $handle = fopen("http://websiteyouwanttoscrape.com/file.html", "r"); $contents = stream_get_contents($handle); $contents_array = array(); $bit_i_want = array(); // give yourself a chance $contents = htmlspecialchars($contents); // swap these if you don't use htmlspecialchars(); $contents_array = explode('<td>',$contents); //$contents_array = explode('<td>',$contents); $counter = 0; while($counter < count($contents_array)){ if(strpos($contents_array[$counter], 'Heading #1') > 0 ){ // swap these if you don't use htmlspecialchars(); $bit_i_want = explode('</td>',$contents_array[$counter+1]); //$bit_i_want = explode('</td>',$contents_array[$counter+1]); echo $bit_i_want[0] . '<br />'; // uncomment break; to stop the loop if you don't // want to look for any more instances of "Heading #1" if there were any //break; } $counter++; } fclose($handle); //close the file