javascript regexp backReferências na classe de caráter possível?
-
20-09-2019 - |
Pergunta
O JavaScript Expressões regulares suporta referências na classe de personagens?
Eu quero fazer algo assim:
htmlString.replace(/attribute_name=(['"])[^\1]*\1/,'')
Mas isso não funciona. Isso faz:
htmlString.replace(/attribute_name=(['"])[^'"]*\1/,'')
Infelizmente, meu atributo_name pode conter apóstrofos ou citações, então preciso expor o personagem de citação real do interior do atributo, mas deixe o outro. Não posso ter certeza de qual é usado. Posso assumir com segurança que as citações estão em forma de entidade, mas ainda assim pode haver apóstrofes dentro:
<div attribute_name="John's car" class="someClass"></div>
<div attribute_name='some "quoted text"' class="someClass"></div>
Não consigo prever qual de "ou 'será usado em torno do atributo.
Como se livrar do atributo e deixar o atributo de classe em paz (não cortado muito)?
Contexto: estou recebendo o HTML por $ ('TemplateContainer'). Innerhtml. Eu tenho que modificar esse HTML antes de inseri -lo na página novamente. Eu tenho que cortar alguns Attibutes não padrão e todos os atributos de ID.
Solução
Você seria muito melhor usando o DOM ou algum outro modelo real projetado para conteúdo hierárquico. Dito isto, se você devo Use Regex, a maneira mais simples provavelmente seria usar apenas um |
(Ou) em vez disso.
htmlString.replace(/attribute_name=('[^']*'|"[^"]*")/,'')
Outras dicas
Concordo com as outras respostas, pois não acho que os atributos sejam o lugar para fazer esse tipo de coisa, mas também tenho receio de recomendar o DOM. Sinto -me sujo quando faço isso, não sei por quê.
Normalmente, tentarei usar um objeto JavaScript para armazenar meus dados e, em seguida, referenciá-lo usando teclas bem formadas, etc. dar de ombros É mais trabalho, mas é o IMHO mais limpo. Mas, definitivamente, não é a única maneira de realizar a tarefa.
Quanto à sua pergunta, você também pode usar a correspondência não-greedora em JavaScript e seria assim:
htmlString.replace(/ ?attribute_name=(['"]).*?\1/, '')