From 8d2b10468f072aa061f182433ac306458ead4815 Mon Sep 17 00:00:00 2001
From: Daniel Winzen <d@winzen4.de>
Date: Sun, 6 Mar 2016 07:52:08 +0100
Subject: [PATCH] Allow using html tags in linkfilter without breaking
 dereferrer or image embed

---
 CHANGELOG |  2 ++
 chat.php  | 16 ++++++++--------
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 6b70a08..20d8ea9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+Version 1.15.3 - Mar. 6, 2016
+Allow using html tags in linkfilter without breaking dereferrer or image embed
 Added French translation
 Added 2 Spanish translations.
 
diff --git a/chat.php b/chat.php
index dd709f8..d80e160 100644
--- a/chat.php
+++ b/chat.php
@@ -2647,7 +2647,7 @@ function apply_linkfilter(){
 		}
 	}
 	foreach($filters as $filter){
-		$U['message']=preg_replace_callback("/<a href=\"([^\"]+)\" target=\"_blank\">([^<]+)<\/a>/i",
+		$U['message']=preg_replace_callback("/<a href=\"([^\"]+)\" target=\"_blank\">(.*?(?=<\/a>))<\/a>/i",
 			function ($matched) use(&$filter){
 				return "<a href=\"$matched[1]\" target=\"_blank\">".preg_replace("/$filter[match]/i", $filter['replace'], $matched[2]).'</a>';
 			}
@@ -2655,7 +2655,7 @@ function apply_linkfilter(){
 	}
 	$redirect=get_setting('redirect');
 	if(get_setting('imgembed')){
-		$U['message']=preg_replace_callback('/\[img\]\s?<a href="([^"]+)" target="_blank">([^<]+)<\/a>/i',
+		$U['message']=preg_replace_callback('/\[img\]\s?<a href="([^"]+)" target="_blank">(.*?(?=<\/a>))<\/a>/i',
 			function ($matched){
 				return str_ireplace('[/img]', '', "<br><a href=\"$matched[1]\" target=\"_blank\"><img src=\"$matched[1]\"></a><br>");
 			}
@@ -2665,15 +2665,15 @@ function apply_linkfilter(){
 		$redirect="$_SERVER[SCRIPT_NAME]?action=redirect&url=";
 	}
 	if(get_setting('forceredirect')){
-		$U['message']=preg_replace_callback('/<a href="([^"]+)" target="_blank">([^<]+)<\/a>/',
+		$U['message']=preg_replace_callback('/<a href="([^"]+)" target="_blank">(.*?(?=<\/a>))<\/a>/',
 			function ($matched) use($redirect){
 				return "<a href=\"$redirect".urlencode($matched[1])."\" target=\"_blank\">$matched[2]</a>";
 			}
 		, $U['message']);
-	}elseif(preg_match_all('/<a href="([^"]+)" target="_blank">([^<]+)<\/a>/', $U['message'], $matches)){
+	}elseif(preg_match_all('/<a href="([^"]+)" target="_blank">(.*?(?=<\/a>))<\/a>/', $U['message'], $matches)){
 		foreach($matches[1] as $match){
 			if(!preg_match('~^http(s)?://~', $match)){
-				$U['message']=preg_replace_callback('/<a href="('.str_replace('/', '\/', $match).')\" target=\"_blank\">([^<]+)<\/a>/',
+				$U['message']=preg_replace_callback('/<a href="('.str_replace('/', '\/', $match).')\" target=\"_blank\">(.*?(?=<\/a>))<\/a>/',
 					function ($matched) use($redirect){
 						return "<a href=\"$redirect".urlencode($matched[1])."\" target=\"_blank\">$matched[2]</a>";
 					}
@@ -2837,7 +2837,7 @@ function print_messages($delstatus=''){
 				$message['text']=openssl_decrypt($message['text'], 'aes-256-cbc', $C['encryptkey'], 0, '1234567890123456');
 			}
 			if($injectRedirect){
-				$message['text']=preg_replace_callback('/<a href="([^"]+)" target="_blank">([^<]+)<\/a>/',
+				$message['text']=preg_replace_callback('/<a href="([^"]+)" target="_blank">(.*?(?=<\/a>))<\/a>/',
 					function ($matched) use ($redirect){
 						return "<a href=\"$redirect".urlencode($matched[1])."\" target=\"_blank\">$matched[2]</a>";
 					}
@@ -2871,7 +2871,7 @@ function print_messages($delstatus=''){
 				$message['text']=openssl_decrypt($message['text'], 'aes-256-cbc', $C['encryptkey'], 0, '1234567890123456');
 			}
 			if($injectRedirect){
-				$message['text']=preg_replace_callback('/<a href="([^"]+)" target="_blank">([^<]+)<\/a>/',
+				$message['text']=preg_replace_callback('/<a href="([^"]+)" target="_blank">(.*?(?=<\/a>))<\/a>/',
 					function ($matched) use($redirect) {
 						return "<a href=\"$redirect".urlencode($matched[1])."\" target=\"_blank\">$matched[2]</a>";
 					}
@@ -3375,7 +3375,7 @@ function load_lang(){
 function load_config(){
 	global $C;
 	$C=array(
-		'version'	=>'1.15.2', // Script version
+		'version'	=>'1.15.3', // Script version
 		'dbversion'	=>14, // Database version
 		'keeplimit'	=>3, // Amount of messages to keep in the database (multiplied with max messages displayed) - increase if you have many private messages
 		'msgencrypted'	=>false, // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing!