/ / Pokúšam sa uniknúť z reťazca, ktorý sa použije ako selektor jQuery - javascript, jquery, regex

Snaží sa uniknúť reťazec, ktorý sa používa ako jQuery selector - javascript, jquery, regex

Mám nasledujúci kód, ktorý som ukradol z inej SO otázky,

$("#"+"^`test".replace(/[!"#$%&"()*+,./:;<=>?@[\]^`{|}~]/g, "\\$&"))

ktorý spôsobí nasledujúcu chybu.

Uncaught Error: Syntax error, unrecognized expression: # \ ^ \ `test (...)

Mám len nejaké ID so šialenými znakmi, ako napríklad ^ a `, ktoré potrebujem, aby sa jQuery nezadusil. Nechápem, prečo sa táto chyba deje, pretože ak manuálne pridám lomítka do reťazca ako,

$("#"+"\^\`test")

potom to funguje dobre. Čo je zlé na metóde regulárneho výrazu?

odpovede:

3 pre odpoveď č. 1

Mám len nejaké ID so šialenými znakmi, ako napríklad ^ a `, ktoré potrebujem, aby sa jQuery nezadusil.

Zďaleka najjednoduchší spôsob riešenia, ktorý je možné dosiahnuť pomocou selektora atribútov:

$("[id="" + theId + ""]").doSomething();

Tak dlho theId neobsahuje spätné lomky ani dvojité úvodzovky, nie je potrebné ďalšie unikanie.


2 pre odpoveď č. 2

Ďalším riešením je použitie vanilky getElementById, ktorý neanalyzuje selektor. Takto stále máte efektivitu výberu podľa id:

let res = $(document.getElementById("^`test"));

0 pre odpoveď č. 3

Čo tak to využiť?

const $ID = function(selector){
return $("[id="" + selector.match(/#?(S+)/)[1] + ""]")
}

Potom ho môžete použiť rovnako ako jQuery

$ID("#^`div")

0 pre odpoveď č. 4

Potrebujete dvakrát únik. Pretože na nahradenie / regulárny výraz potrebujete najskôr únik, aby ste mohli napísať únik. Ďalším únikom je potreba z jquery o $ ().

Jasnejšia syntax ako regulárny výraz postet je:

"#^bla`".replace("^","\^").replace("`","\`");

nahradí "# ^ bla" "" # \ ^ bla \ "".

Uncaught Error: Syntax error, unrecognized expression: # \ ^ \ `test (...)

Ak chcete použiť svoj regulárny výraz, musíte tiež uniknúť [] pomocou [a].

"+".replace(/[!"#$%&"()*+,."()*+,./:;<=>?@[\]^`{|}~]/g, "yes")