Re: Using DOM textContent Property
| From: | Nathan Nobbe | Date: | Wed, 03 Sep 2008 18:54:36 +0000 |
| Subject: | Re: Using DOM textContent Property | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-279438@lists.php.net to get a copy of this message | ||
On Wed, Sep 3, 2008 at 10:03 AM, Tim Gustafson <tjg@soe.ucsc.edu> 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
nathan@devel ~ $ 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>quickshiftin@gmail.com<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:quickshiftin@gmail.com">
quickshiftin@gmail.com</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>quickshiftin@gmail.com<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