Při studiu a práci s JavaScriptem jsem mnohokrát narazil na situace, kdy mi standardní JavaScriptové funkce nestačily. Řešení v PHP by bylo triviální, ovšem v JavaScriptu dané funkce prostě chyběly. Trochu jsem hledal a narazil na zajímavý projekt phpjs.org, kde jsem objevil rozsáhlou knihovnu PHP funkcí přepsaných do JS. Samozřejmě mi nedalo se o ně nepodělit.

Funkce strip_tags

Odstranění HTML tagů ze stringu není úplně triviální operace. Následující funkce nám zajistí, že se problémem nebudeme muset zabývat.

/**
 * ekvivalent k php strip_tags
 * @param string html
 * @return string  
 **/
function strip_tags(html){
	if (arguments.length < 3) {
		html = html.replace(/<\/?(?!\!)[^>]*>/gi, '');
	} else {
		allowed = arguments[1];
		specified = eval("["+arguments[2]+"]");
		if (allowed) {
			regex='<!--?(?!(' + specified.join('|') + '))\b[^-->]*>';
			html = html.replace(new RegExp(regex, 'gi'), '');
		} else {
			regex = '<!--?(' + specified.join('|') + ')\b[^-->]*>';
			html=html.replace(new RegExp(regex, 'gi'), '');
		}
	}
	return html;
}

Funkce array_key_exists

V PHP lze v některých případech nahradit za isset(), ovšem v JavaScriptu už je nutné použít operaci. Funkce array_key_exists nám to přecijen trochu zpříjemní.

/**
 * ekvivalent k php array_key_exists
 * @param string key
 * @param array | object item
 * @return bool   
 **/
function array_key_exists(key, value) {
	return value[key] !== undefined ? true : false;
}

Funkce in_array

Výskyt hodnoty v poli si můžeme usnadnit redeklarací funkce in_array. V JavaScriptu nám bude navíc fungovat i se statickými objekty. Třetí argument chybí, ovšem abych se přiznal, vůbec mě to netrápí.

/**
 * ekvivalent k PHP in_array (bez tretiho parametru)
 * @param string needle
 * @param array haystack      
 **/
function in_array(needle, haystack) {  
	for (i in haystack) {
		if (needle == haystack[i]) {
			return true;
		}
	}
	return false;  
}

Funkce trim

Validace formulářů je poměrně často prováděná operace. U textových polí rozhodně nechceme, aby například mezera prošla kontrolou jako neprázdný řetězec. Za tím účelem využijeme právě trim. Používám zjednodušené řešení bez implementace druhého argumentu.

/**
 * ekvivalent k PHP trim (bez druheho parametru) zdroj: jquery 
 * @param string arg
 * @return arg
 **/
function trim(arg) {
	return (arg || '').replace( /^\s+|\s+$/g, '');
}

htmlspecialchars

Další chytrá funkce, kterou JavaScript postrádá je htmlspecialchars.

function htmlspecialchars (string, quote_style, charset, double_encode) {
	var optTemp = 0, i = 0, noquotes= false;
	if (typeof quote_style === 'undefined' || quote_style === null) {
		quote_style = 2;
	}
	string = string.toString();
	if (double_encode !== false) {
		string = string.replace(/&/g, '&');
	}
	string = string.replace(//g, '>');
	
	var OPTS = {
		'ENT_NOQUOTES': 0,
		'ENT_HTML_QUOTE_SINGLE' : 1,
		'ENT_HTML_QUOTE_DOUBLE' : 2,
		'ENT_COMPAT': 2,
		'ENT_QUOTES': 3,
		'ENT_IGNORE' : 4
	};
	if (quote_style === 0) {
		noquotes = true;
	}
	if (typeof quote_style !== 'number') {
		quote_style = [].concat(quote_style);
		for (i=0; i < quote_style.length; i++) {
			if (OPTS[quote_style[i]] === 0) {
				noquotes = true;
			} else if (OPTS[quote_style[i]]) {
				optTemp = optTemp | OPTS[quote_style[i]];
			}
		}
		quote_style = optTemp;
	}
	if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
		string = string.replace(/'/g, ''');
	}
	if (!noquotes) {
		string = string.replace(/"/g, '"');
	}
	
	return string;
}

htmlspecialchars('<a href="test">Test</a>', 'ENT_QUOTES');
htmlspecialchars('ab"c\'d', ['ENT_NOQUOTES', 'ENT_QUOTES']);

Práce s cookies

Jak je v PHP práce s cookies jednoduchá, v JS je to peklo. Kdysi dávno jsem si proto vyhledal řešení, které pokud mi nezemřelo, tak funguje šťastně až dodnes . Půjde o dvě funkce, jednu na nastavení a druhou na získání cookie. Jejich použití je jasně patrné z argumentů.

/**
 * vrati cookie dle name
 * @param string Name
 **/
function getCookie(Name) {
	replace = new RegExp(Name + "=[^;]+", "i");
	if (document.cookie.match(replace)) {
		return document.cookie.match(replace)[0].split("=")[1]
	}
	return null;
}

/**
 * nastavi cookie
 * @param string name
 * @param string value
 * @param int exhrs (30 dnu vychozi)
 * @param path (root vychozi)
 * @param samesite (Strict vychozi)
 **/
function setCookie(cname, cvalue, exhrs, path, samesite){
	var c, d = new Date();
	d.setTime(d.getTime() + ((exhrs || (30 * 24)) * 60 * 60 * 1000));
	
	c = cname + '=' + cvalue + '; ';
	c+= 'Expires=' + d.toUTCString() + '; ';
	c+= 'Path=' + (path || '/') + '; ';
	c+= 'SameSite=' + (samesite || 'Strict');
	c+= (document.location.protocol == 'https:' ? '; Secure' : '');
	
	document.cookie = c;
}

Edit 28. 4. 2020: Funkce setCookie byla upravena, aby reflektovala dnes už doporučené nastavení SameSite=Strict a respektovala protokol. setCookie není úplně stroprocentním ekvivalentem svého PHP vzoru, protože například nenastavuji doménu a Secure detekuji sám, ovšem pro JavaScriptové účely to bohatě stačí.