diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index c3889a41456bd0a89a54fac610234b761dcdf158..9016f81ce340247c99a7fde44d8a993edd815c8d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3414,13 +3414,13 @@ function picto_required() * Clean a string from all HTML tags and entities * * @param string $StringHtml String to clean - * @param string $removelinefeed Replace also all lines feeds by a space + * @param string $removelinefeed Replace also all lines feeds by a space, otherwise only last one are removed * @param string $pagecodeto Encoding of input/output string * @return string String cleaned */ function dol_string_nohtmltag($StringHtml,$removelinefeed=1,$pagecodeto='UTF-8') { - $pattern = "/<[^>]+>/"; + $pattern = "/<[^<>]+>/"; $temp = dol_html_entity_decode($StringHtml,ENT_COMPAT,$pagecodeto); $temp = preg_replace($pattern,"",$temp); @@ -3486,7 +3486,6 @@ function dol_htmlentitiesbr($stringtoencode,$nl2brmode=0,$pagecodefrom='UTF-8') $newstring=strtr($newstring,array('&'=>'__and__','<'=>'__lt__','>'=>'__gt__','"'=>'__dquot__')); $newstring=dol_htmlentities($newstring,ENT_COMPAT,$pagecodefrom); // Make entity encoding $newstring=strtr($newstring,array('__and__'=>'&','__lt__'=>'<','__gt__'=>'>','__dquot__'=>'"')); - //$newstring=strtr($newstring,array('__li__'=>"<li>\n")); // Restore <li>\n } else { @@ -3530,7 +3529,7 @@ function dol_htmlcleanlastbr($stringtodecode) * Replace html_entity_decode functions to manage errors * * @param string $a Operand a - * @param string $b Operand b + * @param string $b Operand b (ENT_QUOTES=convert simple and double quotes) * @param string $c Operand c * @return string String decoded */ @@ -3670,17 +3669,10 @@ function dol_textishtml($msg,$option=0) { if (preg_match('/<html/i',$msg)) return true; elseif (preg_match('/<body/i',$msg)) return true; - elseif (preg_match('/<b>/i',$msg)) return true; - elseif (preg_match('/<br/i',$msg)) return true; - elseif (preg_match('/<div/i',$msg)) return true; - elseif (preg_match('/<em>/i',$msg)) return true; - elseif (preg_match('/<font/i',$msg)) return true; - elseif (preg_match('/<img/i',$msg)) return true; - elseif (preg_match('/<i>/i',$msg)) return true; - elseif (preg_match('/<li/i',$msg)) return true; - elseif (preg_match('/<span/i',$msg)) return true; - elseif (preg_match('/<strong/i',$msg)) return true; - elseif (preg_match('/<table/i',$msg)) return true; + elseif (preg_match('/<(b|em|i)>/i',$msg)) return true; + elseif (preg_match('/<(br|div|font|img|li|span|strong|table)>/i',$msg)) return true; + elseif (preg_match('/<(br|div|font|img|li|span|strong|table)\s+[^<>\/]*>/i',$msg)) return true; + elseif (preg_match('/<(br|div|font|img|li|span|strong|table)\s+[^<>\/]*\/>/i',$msg)) return true; elseif (preg_match('/&[A-Z0-9]{1,6};/i',$msg)) return true; // Html entities names (http://www.w3schools.com/tags/ref_entities.asp) elseif (preg_match('/&#[0-9]{2,3};/i',$msg)) return true; // Html entities numbers (http://www.w3schools.com/tags/ref_entities.asp) return false; @@ -3688,7 +3680,7 @@ function dol_textishtml($msg,$option=0) } /** - * Concat 2 descriptions (second one after first one) + * Concat 2 descriptions (second one after first one with a new line separator if required) * text1 html + text2 html => text1 + '<br>' + text2 * text1 html + text2 txt => text1 + '<br>' + dol_nl2br(text2) * text1 txt + text2 html => dol_nl2br(text1) + '<br>' + text2 diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 3707a8752389b80df4fc22784d5fe68d949dc8f2..b8414dd170ef2bba1266e5ca18928527d8de6158 100755 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -168,13 +168,22 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $input='xxx <b>yyy</b> zzz'; $after=dol_textishtml($input); $this->assertTrue($after); + $input='text with <div>some div</div>'; + $after=dol_textishtml($input); + $this->assertTrue($after); + $input='text with HTML entities'; + $after=dol_textishtml($input); + $this->assertTrue($after); $input='xxx<br>'; $after=dol_textishtml($input); $this->assertTrue($after); - $input='text with <div>some div</div>'; + $input='xxx<br >'; $after=dol_textishtml($input); $this->assertTrue($after); - $input='text with HTML entities'; + $input='xxx<br style="eee">'; + $after=dol_textishtml($input); + $this->assertTrue($after); + $input='xxx<br style="eee" >'; $after=dol_textishtml($input); $this->assertTrue($after); @@ -182,6 +191,12 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase $input='xxx < br>'; $after=dol_textishtml($input); $this->assertFalse($after); + $input='xxx <email@email.com>'; // <em> is html, <em... is not + $after=dol_textishtml($input); + $this->assertFalse($after); + $input='xxx <brstyle="ee">'; + $after=dol_textishtml($input); + $this->assertFalse($after); } @@ -208,6 +223,53 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase return true; } + /** + * testDolConcat + * + * @return boolean + */ + public function testDolConcat() + { + $text1="A string 1"; $text2="A string 2"; // text 1 and 2 are text, concat need only \n + $after=dol_concatdesc($text1, $text2); + $this->assertEquals("A string 1\nA string 2",$after); + + $text1="A<br>string 1"; $text2="A string 2"; // text 1 is html, concat need <br>\n + $after=dol_concatdesc($text1, $text2); + $this->assertEquals("A<br>string 1<br>\nA string 2",$after); + + $text1="A string 1"; $text2="A <b>string</b> 2"; // text 2 is html, concat need <br>\n + $after=dol_concatdesc($text1, $text2); + $this->assertEquals("A string 1<br>\nA <b>string</b> 2",$after); + + return true; + } + + + /** + * testDolStringNohtmltag + * + * @return boolean + */ + public function testDolStringNohtmltag() + { + $text="A\nstring\n"; + $after=dol_string_nohtmltag($text,0); + $this->assertEquals("A\nstring",$after,"test1"); + + $text="A <b>string<b>\n\nwith html tag and '<' chars<br>\n"; + $after=dol_string_nohtmltag($text, 0); + $this->assertEquals("A string\n\nwith html tag and '<' chars",$after,"test2"); + + $text="A <b>string<b>\n\nwith tag with < chars<br>\n"; + $after=dol_string_nohtmltag($text, 1); + $this->assertEquals("A string with tag with < chars",$after,"test3"); + + return true; + } + + + /** * testDolHtmlEntitiesBr *