Regexp para search / replace solo text, no en atributo HTML

Estoy usando JavaScript para hacer algunas expresiones regulares. Teniendo en count que estoy trabajando con una fuente bien formada, y quiero eliminar cualquier espacio antes de [,.] y mantener solo un espacio después de [,.], Excepto que [,.] Es parte de un número. Por lo tanto uso:

text = text.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2'); 

El problema es que esto también reemplaza el text en los attributes de la label html. Por ejemplo, mi text es (siempre envuelto con una label):

 <p>Test,and test . Again <img src="xyz.jpg"> ...</p> 

Ahora agrega un espacio como este src="xyz. jpg" que no se espera. ¿Cómo puedo volver a escribir mi expresión regular? Lo que quiero es

 <p>Test, and test. Again <img src="xyz.jpg"> ...</p> 

¡Gracias!

6 Solutions collect form web for “Regexp para search / replace solo text, no en atributo HTML”

Puede usar un análisis anticipado para asegurarse de que la coincidencia no se produce dentro de una label:

 text = text.replace(/(?![^<>]*>) *([.,]) *([^ \d])/g, '$1 $2'); 

Las advertencias habituales se aplican a las secciones CDATA, los comentarios SGML, los elementos SCRIPT y los corchetes angulares en los valores de los attributes. Pero sospecho que tus problemas reales popupán de los caprichos del text "simple"; HTML ni siquiera está en la misma liga. :RE

No intente reescribir su expresión para hacer esto. No tendrá éxito y seguramente se olvidará de algunos casos de esquina. En el mejor de los casos, esto provocará errores desagradables y, en el peor de los casos, presentará problemas de security.

En cambio, cuando ya está usando JavaScript y tiene un código bien formado, use un analizador XML genuino para recorrer los nodos de text y aplicarles solamente su expresión regular.

Si puede acceder a ese text a través del DOM, puede hacer esto:

 function fixPunctuation(elem) { // check if parameter is a an ELEMENT_NODE if (!(elem instanceof Node) || elem.nodeType !== Node.ELEMENT_NODE) return; var children = elem.childNodes, node; // iterate the child nodes of the element node for (var i=0; children[i]; ++i) { node = children[i]; // check the child's node type switch (node.nodeType) { case Node.ELEMENT_NODE: // call fixPunctuation if it's also an ELEMENT_NODE fixPunctuation(node); break; case Node.TEXT_NODE: // fix punctuation if it's a TEXT_NODE node.nodeValue = node.nodeValue.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2'); break; } } } 

Ahora solo pase el nodo DOM a esa function de esta manera:

 fixPunctuation(document.body); fixPunctuation(document.getElementById("foobar")); 

Html no es un "lenguaje regular", por lo tanto, regex no es la herramienta óptima para analizarlo. Puede que sea más adecuado usar un analizador html como este para get el atributo y luego aplicar regex para hacer algo con el valor.

¡Disfrutar!

Como se indicó anteriormente y muchas veces antes, HTML no es un lenguaje normal y, por lo tanto, no se puede analizar con expresiones regulares.

Tendrás que hacer esto recursivamente; Sugeriría que rastree el object DOM.

Prueba algo como esto …

 function regexReplaceInnerText(curr_element) { if (curr_element.childNodes.length <= 0) { // termination case: // no children; this is a "leaf node" if (curr_element.nodeName == "#text" || curr_element.nodeType == 3) { // node is text; not an empty tag like <br /> if (curr_element.data.replace(/^\s*|\s*$/g, '') != "") { // node isn't just white space // (you can skip this check if you want) var text = curr_element.data; text = text.replace(/ *(,|\.) *([^ 0-9])/g, '$1 $2'); curr_element.data = text; } } } else { // recursive case: // this isn't a leaf node, so we iterate over all children and recurse for (var i = 0; curr_element.childNodes[i]; i++) { regexReplaceInnerText(curr_element.childNodes[i]); } } } // then get the element whose children's text nodes you want to be regex'd regexReplaceInnerText(document.getElementsByTagName("body")[0]); // or if you don't want to do the whole document... regexReplaceInnerText(document.getElementById("ElementToRegEx")); 

No analice regex HTML con HTML regex . Si sabe que su HTML está bien formado, use un analizador HTML / XML. De lo contrario, ejecútelo primero a través de Tidy y luego use un analizador XML.

  • Eliminar saltos de línea desde el inicio y el final de la cadena
  • Javascript camelCase a forma regular
  • Cómo get todas las coincidencias posibles superpuestas para una cadena
  • Regex que coincide con numérico con hasta 2 decimales
  • Cómo replace la última aparición de caracteres en una cadena usando javascript
  • Combinando dos expresiones regulares
  • ¿Qué significa doble corchetes ] en una expresión regular?
  • Regex - Combina el carácter repetido no en secuencia
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.