summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2012-01-16 15:31:01 +0400
committerAndrew Dolgov <[email protected]>2012-01-16 15:31:01 +0400
commit73c32678ae44d33aea36696cf7db3f382476b7c1 (patch)
treee68c7b0052327a91f0404d35b07867de36233da2 /include
parentb8379e69792d41c62fa656ebbfb159fabe2e633d (diff)
rewrite_urls implementation based on DOMDocument (refs #413)
Diffstat (limited to 'include')
-rw-r--r--include/functions.php44
1 files changed, 43 insertions, 1 deletions
diff --git a/include/functions.php b/include/functions.php
index 5ccbe8a58..e35d7c1c6 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -4849,7 +4849,7 @@
}
- function rewrite_urls($line) {
+/* function rewrite_urls($line) {
global $url_regex;
$urls = null;
@@ -4858,6 +4858,48 @@
"<a target=\"_blank\" href=\"\\1\">\\1</a>", $line);
return $result;
+ } */
+
+ function rewrite_urls($html) {
+ libxml_use_internal_errors(true);
+
+ $charset_hack = '<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ </head>';
+
+ $doc = new DOMDocument();
+ $doc->loadHTML($charset_hack . $html);
+ $xpath = new DOMXPath($doc);
+
+ $entries = $xpath->query('//*/text()');
+
+ foreach ($entries as $entry) {
+ if (strstr($entry->wholeText, "://") !== false) {
+ $text = preg_replace("/((?<!=.)((http|https|ftp)+):\/\/[^ ,!]+)/i",
+ "<a target=\"_blank\" href=\"\\1\">\\1</a>", $entry->wholeText);
+
+ if ($text != $entry->wholeText) {
+ $cdoc = new DOMDocument();
+ $cdoc->loadHTML($charset_hack . $text);
+
+
+ foreach ($cdoc->childNodes as $cnode) {
+ $cnode = $doc->importNode($cnode, true);
+
+ if ($cnode) {
+ $entry->parentNode->insertBefore($cnode);
+ }
+ }
+
+ $entry->parentNode->removeChild($entry);
+
+ }
+ }
+ }
+
+ $node = $doc->getElementsByTagName('body')->item(0);
+
+ return $doc->saveXML($node);
}
function filter_to_sql($filter) {