PHP find and get value based on another one from H

2019-01-20 18:16发布

I am using PHP Simple HTML DOM Parser for my project.

I am trying to find specific data and echo it after I parse my .php file from a URL Website which contains data inside HTML table element, example is below:

<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>

My question:

How can I get value "Example of data #1" from the second TD cell element in first TR row element by knowing that the first TD cell in the same TR row contains value "Heading #1 ..." from this kind of a table?

I have parsed URL, now I need to find value based on the other value which is next to it.

Should I use some regex and make some pattern for that? strpos() and array?

1条回答
beautiful°
2楼-- · 2019-01-20 18:39

You would need to give the table divisions an ID for JavaScript to be able to get the data for submission and put it into hidden inputs with names and IDs so that PHP will get them using 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>

In your form which submits to wherever you want it to go using method="post" you would need:

    <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()" />

In PHP you would pick them up with $_POST['ex1_hidden'] and $_POST['ex2_hidden'] (remember to clean up submitted data.)

This is not a method which would be suitable for for secure data.

You could add an ID to the heading and make it conditional in your script:

if(documentGetElementById('hdg1').innerHTML == "Heading #1"){
   documentGetElementById('ex1_hidden').value = documentGetElementById('ex1').innerHTML;
}

You might need to trim the whitespace off the heading perhaps by using something like

    var str=documentGetElementById('hdg1').innerHTML.replace(/^\s+|\s+$/g,'');

Credit @Paul on how do I strip white space when grabbing text with jQuery?

Lots of useful ideas on other ways here How to get a table cell value using jQuery?

If this is scraped data from another website which you don't have control over at all, but which you already have in a PHP variable, you could explode() it by <td> and work out which array positions contain the data you want. Ref: http://php.net/manual/en/function.explode.php

This is what I think you are really looking for - might be a nice idea to ask the owner of the site if it is OK first but that is up to you. You were on the right track with strpos(); and arrays (tested using your table):

 // 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('&lt;td&gt;',$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('&lt;/td&gt;',$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
查看更多
登录 后发表回答