JavaScriptové ekvivalenty PHP funkcí
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čí.
Komentáře k článku:
Buďte první, kdo článek okomentuje!