Nathan,
 
Thanks for the suggestion, but it's still not working for me.  Here's my
code:

=========== 
$HTML = new DOMDocument();
@$HTML->loadHTML($text);
$Elements = $HTML->getElementsByTagName("*");

for ($X = 0; $X < $Elements->length; $X++) {
  $Element =  $Elements->item($X);

  if ($Element->tagName == "a") {
    # SNIP - Do something with A tags here
  } else if ($Element instanceof DOMText) {
    echo $Element->nodeValue; exit;
  }
}
=========== 

This loop never executes the instanceof part of the code.  If I add:

  } else if ($Element instanceof DOMNode) {
    echo "foo!"; exit;
  }

Then it echos "foo!" as expected.  It just seems that none of the nodes in
the tree are DOMText nodes.  In fact, get_class($Element) returns
"DOMElement" for every node in the tree.

Tim Gustafson
SOE Webmaster
UC Santa Cruz
[EMAIL PROTECTED]
831-459-5354



 


________________________________

        From: Nathan Nobbe [mailto:[EMAIL PROTECTED] 
        Sent: Wednesday, September 03, 2008 11:55 AM
        To: Tim Gustafson
        Cc: [EMAIL PROTECTED]; php-general@lists.php.net
        Subject: Re: [PHP] Using DOM textContent Property
        
        
        On Wed, Sep 3, 2008 at 10:03 AM, Tim Gustafson <[EMAIL PROTECTED]>
wrote:
        

                > I think you might be better off using regexp on the text
                > *before* sending it through the DOM parser. Send the
                > user's text through a function that searches for URLs
                > and email addresses, creating proper links as they're
                > found, then use the output from that to move on to your
                > DOM stuff. That way, you need not create new nodes in
                > your nodelist.
                
                
                I think that's the way I'm going to have to go, but I was
really hoping not
                to.  Thanks for the suggestion!


        i think i have what youre looking for Tim, take a look at this
script output
        
        [EMAIL PROTECTED] ~ $ php testDom.php 
        IN:
        <?xml version="1.0" standalone="yes"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd";>
        <html><body>Test<br/><h2>[EMAIL PROTECTED]<a name="bar">stuff
inside the link</a>Foo</h2><p>care</p><p>yoyser</p></body></html>
        
        OUT: 
        <?xml version="1.0" standalone="yes"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd";>
        <html><body>Test<br/><h2><a
href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a><a
name="bar">stuff inside the
link</a>Foo</h2><p>care</p><p>yoyser</p></body></html>
        
        and heres the code using the DOM extension
        you may have to tweak it to suit your needs, but currently i think
it does the trick ;)
        
        <?php
        $doc = new DOMDocument();
        $doc->loadHTML('<html><body>Test<br><h2>[EMAIL PROTECTED]<a
name="bar">stuff inside the
link</a>Foo</h2><p>care</p><p>yoyser</p></body></html>');
        echo 'IN:' . PHP_EOL . $doc->saveXML() . PHP_EOL;
        findTextNodes($doc->getElementsByTagName('*'),
'convertToLinkIfNecc');
        echo 'OUT: ' .  PHP_EOL . $doc->saveXML() . PHP_EOL;
        
        /**
         * run through a DOMNodeList, looking for text nodes.  apply a
callback to
         * all such text nodes that are encountered
         */
        function  findTextNodes(DOMNodeList $nodesToSearch, $callback) {
            foreach($nodesToSearch as $curNode) {
                if($curNode->hasChildNodes())
                    foreach($curNode->childNodes as $curChild)
                        if($curChild instanceof DOMText)
                            #echo "TEXT NODE FOUND: " . $curChild->nodeValue
. PHP_EOL;
                            /// todo: allow use of hook here
                            call_user_func($callback, $curNode, $curChild);
            }
        }
        
        /**
         * determine if a node should be modified, by chcking to see if a
child is a text node
         * and the text looks like an email address.
         * call a subordinate function to convert the text node into a
mailto anchor DOMElement
         */
        function convertToLinkIfNecc(DomElement $textContainer, DOMText
$textNode) {
            if( (strtolower($textContainer->nodeName) != 'a') &&
                (filter_var($textNode->nodeValue, FILTER_VALIDATE_EMAIL) !==
false) ) {
                convertMailtoToAnchor($textContainer, $textNode);
            }
        }
        
        /**
         * modify a DOMElement that has a DOMText node as a child; create a
DOMElement
         * that represents and a tag, and set the value and href attirbute,
so that it
         * acts as a 'mailto' link
         */
        function convertMailtoToAnchor(DomElement $textContainer, DOMText
$textNode) {
            $newNode = new DomElement('a', $textNode->nodeValue);
            $textContainer->replaceChild($newNode, $textNode);
            $newNode->setAttribute('href', "mailto:{$textNode->nodeValue}");
        }
        
        
        -nathan 
        




-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to