Search code examples
phpdomdomdocumentdomxpath

How to parse element within element by class name?


How to select any element inside specific element tag by class. I need to retrieve attribute "name" value from "input" element that inside element "form". In example. there're 2 forms elements named _arrived and _class. I need to retrieve all attribute name value from form _class

   $source = '
    <form method="post" action"arrived.php" class="_arrived">
    <input type="hidden" name="type1" value="value1" autocomplete="off">
    <input type="hidden" name="type2" value="value2" autocomplete="off">
    <input type="hidden" name="type3" value="value3">
    <input type="hidden" name="type4" value="value4">
    </form>

    <form method="post" action="destiny.php" class="_class">
    <input type="hidden" name="type1" value="value1" autocomplete="off">
    <input type="hidden" name="type2" value="value2" autocomplete="off">
    <input type="hidden" name="type3" value="value3">
    <input type="hidden" name="type4" value="value4">
    <input type="hidden" name="type5" value="value5">
    <input type="hidden" name="type6" value="value6">
    <input type="hidden" name="type7" value="value8">
    <input type="hidden" name="type8" value="value9">
    </form>';


$dom = new DOMDocument();
$dom->loadHTML($source);

$xpath = new DOMXpath($dom);
$items = $xpath->query('//form[@class="_class"]');

 $form = $items->item(0);

 $element = $form->getElementsByTagName("input");

 foreach($element as $elemen){
     foreach($elemen as $value){
         echo $value->getAttribute('name').'<br>';
     }
 }

Solution

  • 1.First you have to iterate over $elements one time

    2.You have to use action="arrived.php" instead of action"arrived.php" to remove warning from your code which is:

    Warning: DOMDocument::loadHTML(): error parsing attribute name in Entity, line: 2 in /in/tl53u on line 24

    Do like below:

    $dom = new DOMDocument();
    $dom->loadHTML($source);
    
    $xpath = new DOMXpath($dom);
    $items = $xpath->query('//form[@class="_class"]');
    
     $form = $items->item(0);
    
     $element = $form->getElementsByTagName("input");
    
     foreach($element as $elemen){
        echo $elemen->getAttribute('name').'<br>';
     }
    

    Output:-https://3v4l.org/Ma8bg

    You can ignore warnings by using libxml_use_internal_errors(true);, but best is to solve them. Check reference below:-

    Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity