Php get element on page

<input type="hidden" id="id" name="id" value="100">    
<? $id = '100'; ?>
<? $getid = echo '<script>document.getElementById("id");</script>'; ?>
<? if( $id == $getid ): ?>
<? echo 'id equal getid'; ?>
<? endif; ?>

I want to get a value using getElementById of current page in php but am unable to using the following code

Show
<? $getid = echo '<script>document.getElementById("id");</script>'; ?> code can't page load.

How can fix my code to get the value?

asked Mar 30, 2015 at 14:55

3

In order to get the html from inside php you can to use output buffer functions and regex:

at the begining of php you call

ob_start();

and then use ob_get_contents to get the content of html and use regex to find id:

preg_match('/id="id"[^>]+?value="([^"]+)"/', ob_get_contents(), $matches);
$getid = $matches[1];
if ($getid == $id) {
    echo 'id equal getid';
}

answered Mar 30, 2015 at 15:16

jcubicjcubic

58.3k48 gold badges211 silver badges372 bronze badges

You can use like this. Not able to use it as you mention.

<?php
$strhtml = '<!doctype html>
<html>
<head>
 <meta charset="utf-8" />
 <title>PHP getElementById, getElementsByTagName</title>
</head>
<body>
 <div id="dv1">http://coursesweb.net</div>
</body></html>';

// create the DOMDocument object, and load HTML from a string
$dochtml = new DOMDocument();
$dochtml->loadHTML($strhtml);

// get the element with id="dv1"
$elm = $dochtml->getElementById('dv1');

// get the tag name, and content
$tag = $elm->tagName;
$cnt = $elm->nodeValue;

echo $tag. ' - '. $cnt;           // div - http://coursesweb.net
?>

jcubic

58.3k48 gold badges211 silver badges372 bronze badges

answered Mar 30, 2015 at 15:13

Php get element on page

I think you are confused. It is possible to pass values from PHP to JavaScript but you can not pass your JavaScript variable to PHP. At the same time you can't really get an associated value of an input tag within the same PHP page but what you can do is set the value to input by using PHP.

answered Mar 30, 2015 at 16:00

(PHP 5, PHP 7, PHP 8)

DOMDocument::getElementByIdSearches for an element with a certain id

Parameters

elementId

The unique id value for an element.

Return Values

Returns the DOMElement or null if the element is not found.

Examples

Example #1 DOMDocument::getElementById() Example

The following examples use book.xml which contains the following:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
  <!ELEMENT books   (book+)>
  <!ELEMENT book    (title, author+, xhtml:blurb?)>
  <!ELEMENT title   (#PCDATA)>
  <!ELEMENT blurb   (#PCDATA)>
  <!ELEMENT author  (#PCDATA)>
  <!ATTLIST books   xmlns        CDATA  #IMPLIED>
  <!ATTLIST books   xmlns:xhtml  CDATA  #IMPLIED>
  <!ATTLIST book    id           ID     #IMPLIED>
  <!ATTLIST author  email        CDATA  #IMPLIED>
]>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<books xmlns="http://books.php/" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <book id="php-basics">
    <title>PHP Basics</title>
    <author email="">Jim Smith</author>
    <author email="">Jane Smith</author>
    <xhtml:blurb><![CDATA[
<p><em>PHP Basics</em> provides an introduction to PHP.</p>
]]></xhtml:blurb>
  </book>
  <book id="php-advanced">
    <title>PHP Advanced Programming</title>
    <author email="">Jon Doe</author>
  </book>
</books>

<?php

$doc

= new DomDocument;// We need to validate our document before referring to the id
$doc->validateOnParse true;
$doc->Load('book.xml');

echo

"The element whose id is 'php-basics' is: " $doc->getElementById('php-basics')->tagName "\n";?>

The above example will output:

The element whose id is 'php-basics' is: book 

See Also

  • DOMDocument::getElementsByTagName() - Searches for all elements with given local tag name

ed at edgiardina dot com

11 years ago

Please note that if your HTML does not contain a doctype declaration, then getElementById will always return null.

carl2088 at gmail dot com

13 years ago

From my experience, getElementById seem to work fine without any setups if you have loaded a HTML document. But in order for getElementById to work with a simple XML document that you've "constructed", you have to set up the id with "xml:" prefix and use setIdAttribute on the element you created or it won't work. See following example, hope this will save someone's frustration. If you have loaded the xml file, then all you have to make sure is the ID has a xml: prefix for the attribute.  But if you start to append the XML document, don't forget to setIdAttribute on the id name or those elements or getElementById will return null when you try to find them.

<?php/* test.xml
    <?xml version="1.0" encoding="utf-8"?>
    <root>
        <child xml:id="id_xxxxxx" status="partial">
            <sub_child>Some Data</sub_child>
        </child>
    </root>
    */
$xmlDom = new DOMDocument('1.0', 'utf-8');
   
$xmlDom->formatOutput = true;                        // we want a nice output

    // create a root

$eltRoot = $xmlDom->createElement("root");
   
$xmlDom->appendChild($eltRoot);$eltChild = $xmlDom->createElement("child");
   
$eltRoot->appendChild($eltChild);// add a id attribute
   
$attr = $xmlDom->createAttribute("xml:id");    // needs xml prefix or getElementById won't work
   
$eltChild->appendChild($attr);/// create the text node and append to the created element
   
$tNode = $xmlDom->createTextNode("id_8120528");
   
$attr->appendChild($tNode);
   
$eltChild->setIdAttribute("xml:id", true);    // VERY IMPORT or getElementById won't work

        // add a id attribute

$attr = $xmlDom->createAttribute("status");
   
$eltChild->appendChild($attr);/// create the text node and append to the created element
   
$tNode = $xmlDom->createTextNode("partial");
   
$attr->appendChild($tNode);    // add a subchild
   
$eltSub = $xmlDom->createElement("sub_child");
   
$eltChild->appendChild($eltSub);$tNode = $xmlDom->createTextNode("Some Data");
   
$eltSub->appendChild($tNode);$id = null;
   
$id = $xmlDom->getElementById("id_8120528");assert ($id != null);$strId = $id->getAttribute("xml:id"); // bug? empty
   
$strStatus = $id->getAttribute("status"); // this works!assert ($id !=null);$xmlDom->save("./_data/test.xml");$xmlDom->load("./_data/test.xml"); // reloading fixes the problem$nodeRoot = $xmlDom->getElementsByTagName("root");
    if (
$nodeRoot->length > 0) {
       
$eltRoot = $nodeRoot->item(0);   
    }
assert($eltRoot != null);$id = null;
   
$id = $xmlDom->getElementById("id_8120528");assert ($id != null);$strId = $id->getAttribute("xml:id"); // this works now!
   
$strStatus = $id->getAttribute("status"); // this works!?>

paradox_haze at live dot de

12 years ago

Had some issues with getElementById() while searching for a specific element in a XHTML document.
I wrote a small function what was solving my problem:

<?php
function getElementById($id)
{
   
$xpath = new DOMXPath($this->domDocument);
    return
$xpath->query("//*[@id='$id']")->item(0);
}
?>

simon at somewhere dot com

15 years ago

SAVE YOURSELF A MAJOR HEADACHE AND A LOT OF SEARCHING THROUGH DOCUMENTATION -

Instead of using $object->setAttribute('id', 'id_name_here')
USE THIS: $object->setAttribute('xml:id', 'id_name_here')

Then, to get the node value: $domDocumentObject->getElementById('id_name_here');

The xml:id attribute should AUTOMATICALLY be defined!!

Woohoo!  That was easy......

Hoi

2 years ago

To set a hidden id that can be used by $dom->getElementById() apply setAttribute('id', true) as in the following example

                    $createItemNode = function ($data) use ($dom) {
                        $node = $dom->createElement("Item");
                        $node->setAttribute('id', $data->id);
                        $node->setAttribute('hed', $data->hed);
                        $node->setAttribute('run_time', $data->run_time);
                        $node->setAttribute('date', $data->date);

                        // Internally mark the id as 'xml:id' for getElementById to work. Adding xml:id manually to the tag will cause loadXML to throw an error DOMDocument: xml:id is not a NCName in Entity
                        $node->setIdAttribute('id', true);

                        return $node;
                    };

With $node->setIdAttribute('id', true), $dom->getElementById($id) will work

When you do $dom->saveXML(), the final doc will not contain any xml:id attribute.

Tangui dot Le-Pense at laposte dot net

16 years ago

Validating a document from a DTD so as to use getElementById is sometimes impossible (for example when the head and body elements are not included yet in a XHtml document : the validation failed).
Fortunately, xml:id is supported by this function :)
That may be useful.
http://www.w3.org/TR/xml-id/

Anonymous

16 years ago

If you're trying to use getElementById with a xml file validated on a xsd file you must first use the schemaValidate function or getElementById will return null
Example:

  $dom = new DomDocument();
  $dom->load("users.xml");
  $dom->schemaValidate("users.xsd");

  $curruser = $dom->getElementById($user->name);

bart at mediawave dot nl

17 years ago

It seems getElementById works fine without setting validateOnParse to true. Which is nice since setting this to true caused some performance problems with my script.

jonbarnett at gmail dot com

15 years ago

If your XML document does not have a DTD that defines the "id" attribute as an ID, then the easiest thing to do is to use XPath->query() to find an element that matches "//[@id='x']"

guillaume dot crico at gmail dot com

13 years ago

You don't want to use "xml:id" ?
Here is the relaxNG trick (with a generic schema):
(tested with libxml 2.6.26)

<?php
$doc
= new DOMDocument();
$doc->load(...); $rng = '
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element>
            <anyName/>
            <ref name="anythingID"/>
        </element>
    </start>
    <define name="anythingID">
        <zeroOrMore>
            <choice>
                <element>
                    <anyName/>
                    <ref name="anythingID"/>
                </element>
                <attribute name="id">
                    <data type="ID"/>
                </attribute>
                <zeroOrMore>
                    <attribute><anyName/></attribute>
                </zeroOrMore>
                <text/>
            </choice>
        </zeroOrMore>
    </define>
</grammar>
'
; $doc->relaxNGValidateSource($rng);
var_dump($doc->getElementById('id1'));
?>

Note that ID values must be valid ones :
  - integers do no work!
  - @see http://www.w3.org/TR/REC-xml/#id
  - => (Letter | '_' | ':') ( Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender  )*