MDL-39378 Improve s() performance.
These changes give about a 10% speed-up in this function. The significant changes are: 1. Simplify the if logic to remove unnecssary cases. 2. Dont pass default argument values to htmlspecialchars, just using the defaults is faster. 3. I can confirm that /i regex is faster than the equivalent regex without the i. I also added more unit tests to test the edge cases.
This commit is contained in:
@@ -70,9 +70,27 @@ class web_testcase extends advanced_testcase {
|
||||
}
|
||||
|
||||
function test_s() {
|
||||
$this->assertEquals(s("This Breaks \" Strict"), "This Breaks " Strict");
|
||||
$this->assertEquals(s("This Breaks <a>\" Strict</a>"), "This Breaks <a>" Strict</a>");
|
||||
// Special cases.
|
||||
$this->assertSame('0', s(0));
|
||||
$this->assertSame('0', s('0'));
|
||||
$this->assertSame('0', s(false));
|
||||
$this->assertSame('', s(null));
|
||||
|
||||
// Normal cases.
|
||||
$this->assertEquals('This Breaks " Strict', s('This Breaks " Strict'));
|
||||
$this->assertEquals('This Breaks <a>" Strict</a>', s('This Breaks <a>" Strict</a>'));
|
||||
|
||||
// Unicode characters.
|
||||
$this->assertEquals('Café', s('Café'));
|
||||
$this->assertEquals('一, 二, 三', s('一, 二, 三'));
|
||||
|
||||
// Don't escape already-escaped numeric entities. (Note, this behaviour
|
||||
// may not be desirable. Perhaps we should remove these tests and that
|
||||
// functionality, but we can only do that if we understand why it was added.)
|
||||
$this->assertEquals('An entity: ৿.', s('An entity: ৿.'));
|
||||
$this->assertEquals('An entity: б.', s('An entity: б.'));
|
||||
$this->assertEquals('An entity: &amp;.', s('An entity: &.'));
|
||||
$this->assertEquals('Not an entity: &amp;#x09ff;.', s('Not an entity: &#x09ff;.'));
|
||||
}
|
||||
|
||||
function test_format_text_email() {
|
||||
|
||||
+6
-6
@@ -85,19 +85,19 @@ define('URL_MATCH_EXACT', 2);
|
||||
* Returns $var with HTML characters (like "<", ">", etc.) properly quoted.
|
||||
* This function is very similar to {@link p()}
|
||||
*
|
||||
* @todo Remove obsolete param $obsolete if not used anywhere
|
||||
*
|
||||
* @param string $var the string potentially containing HTML characters
|
||||
* @param boolean $obsolete no longer used.
|
||||
* @return string
|
||||
*/
|
||||
function s($var, $obsolete = false) {
|
||||
function s($var) {
|
||||
|
||||
if ($var === '0' or $var === false or $var === 0) {
|
||||
if ($var === false) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
return preg_replace("/&#(\d+|x[0-9a-f]+);/i", "&#$1;", htmlspecialchars($var, ENT_QUOTES, 'UTF-8', true));
|
||||
// When we move to PHP 5.4 as a minimum version, change ENT_QUOTES on the
|
||||
// next line to ENT_QUOTES | ENT_HTML5 | ENT_SUBSTITUTE, and remove the
|
||||
// 'UTF-8' argument. Both bring a speed-increase.
|
||||
return preg_replace('/&#(\d+|x[0-9a-f]+);/i', '&#$1;', htmlspecialchars($var, ENT_QUOTES, 'UTF-8'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user