How to clear every data value from ul li tag using PHP?

I have a page with these HTML codes:

<ul class ='trainList'>
<li>
    <div class="smallFont farelist no-discount ">
        <div class="train-no">ABC 701</div>
        <div class="train-time">06:10<br>07:15</div>
        <div class="train-info">
            <div class="box">
                <div class="total-price">MYR 50.00</div>
                <div class="farediscount">
                    <div class="actual-fare-price">Array</div>
                    <div class="train-discount"></div>
                </div>
            </div>
</li>
<li>
    <div class="smallFont farelist no-discount ">
        <div class="train-no">ABC 701</div>
        <div class="train-time">06:10<br>07:15</div>
        <div class="train-info">
            <div class="box">
                <div class="total-price">MYR 50.00</div>
                <div class="farediscount">
                    <div class="actual-fare-price">Array</div>
                    <div class="train-discount"></div>
                </div>
            </div>
</li>

I want to clean and remove the train, there is no time for the train and the cost of trains using the above code.

My code does not clear the information I want, but it gives me a space. I checked a lot of questions posted earlier, but I can't find anything like this.

my code is:

 $train_doc = new DOMDocument();

libxml_use_internal_errors(TRUE); 

if(!empty($html)){ 

  $train_doc->loadHTML($html);

  libxml_clear_errors(); 

  $train_xpath = new DOMXPath($train_doc);


  $train_list = array();

$train = $train_xpath->query('//div[@class="smallFont farelist no-discount"]');
var_dump($train);
if($train->length > 0){   


  foreach($train as $pat){

      $name = $train_xpath->query('div[@class="train-no"]', $pat)->item(0)->nodeValue;

      $train_types = array(); 
      $types = $train_xpath->query('div[@class="train-time"]/a', $pat);


      foreach($types as $type){
          $train_types[] = $type->nodeValue; 


      $train_list[] = array('name' => $name, 'types' => $train_types);

  }
}
}

echo "<pre>";
print_r($train_list);
echo "</pre>";
+4
source share
2 answers

You need to first specify this element in the element, first get each li, and then point to the necessary elements:

$train_list = array();
$train = $train_xpath->query('//li/div[contains(@class, "smallFont farelist no-discount")]');
if($train->length > 0) {
    foreach($train as $t) {
        $time_s =  $train_xpath->evaluate('string(./div[@class="train-time"]/text()[1])', $t);
        $time_e =  $train_xpath->evaluate('string(./div[@class="train-time"]/text()[2])', $t);
        $train_list[] = array(
            'train_no' => $train_xpath->evaluate('string(./div[@class="train-no"])', $t),
            'train_time' => "$time_s - $time_e",
            'train_price' => $train_xpath->evaluate('string(./div[@class="train-info"]/div/div[@class="total-price"])', $t),
        );
    }
}

Output example

+1
source
libxml_use_internal_errors(true);
$page = new DOMDocument();
$page->preserveWhiteSpace = false;
$page->loadHTML($html);
$xpath = new DomXPath($page);

foreach($xpath->query("//*[contains(@class, 'train-time')]") as $element){

      print_r($element->nodeValue); 

}

Hope this helps

0
source

Source: https://habr.com/ru/post/1584194/


All Articles