Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/10/2014, 11:42
tomyedlp
 
Fecha de Ingreso: agosto-2014
Mensajes: 4
Antigüedad: 9 años, 7 meses
Puntos: 0
¿Por qué estas expresiones regulares no funcionan?

Hola, tengo varios formularios de datos para cargar y antes de pasarlo al servidor datos de un formulario, hace una validación de datos mediante expresión regular.

La función que verifica y devuelve un valor:
Código:
function validaForm(idFormulario) {
	var regExpLetras = /^[A-Za-zÑñáéíóúÁÉÍÓÚ0-9\s]+$/g;
	var regExpNum = /^\d+$/;
    // Campos de texto
    alert(idFormulario); //verifica cual formulario es
	if (idFormulario==2) { //es es el formulario 2, hace lo siguiente


		if(!regExpNum.test($("#escribirCodigo").val())) {
			mostrarDialogo("Error: código incorrecto","El campo código debe ser numérico!", "#escribirCodigo");
			return "NO";
		}
		if(!regExpLetras.test($("#tituloProp").val())) {
			mostrarDialogo("Error: título incorrecto","El campo título de propiedad debe contener caracteres alfabéticos o numéricos.", "#tituloProp2");
			return "NO";
		}

		if($("#selectorBarrio2").val()==("" || "Seleccione un partido...")) {
			mostrarDialogo("Error: falta el barrio","Debe seleccionar un barrio a la propiedad.","#selectorBarrio2");
			return "NO";
		}
		// Checkbox
		if($("#incluirMapa2").is(":checked")) {
			if (!regExpLetras.test($("#dirPropiedad2").val())) {
				mostrarDialogo("Error: dirección vacía","La dirección no debe estar vacía, de lo contrario destilde la opción de agregar el mapa.","#dirPropiedad");
				return "NO";
			}
			if (!regExpLetras.test($("#locPropiedad2").val())) {
				mostrarDialogo("Error: localidad vacía","La localidad no debe estar vacía, de lo contrario destilde la opción de agregar el mapa.", "#locPropiedad");
				return "NO";
			}
		}
		if($("#modifPrecio1").is(":checked")) {
			if(!regExpNum.test($("input[name=precio5]").val())) {
				mostrarDialogo("Error: campo de venta incorrecto","El campo de venta debe ser numérico, sin puntos ni coma!","input[name=precio5]");
				return "NO";
			}	
		}
		if($("#modifPrecio2").is(":checked")){
			if(!regExpNum.test($("input[name=precio6]").val())) {
				mostrarDialogo("Error: campo de alquiler incorrecto","El campo de alquiler debe ser numérico, sin puntos ni coma!","input[name=precio6]");
				return "NO";
			}		
		}
		if($("#modifPrecio3").is(":checked")){
			if(!regExpNum.test($("input[name=precio7]").val())) {
				mostrarDialogo("Error: campo de alquiler temporario incorrecto","El campo de alquiler temporario debe ser numérico, sin puntos ni coma!","input[name=precio7]");
				return "NO";
			}	
		}
		if($("#modifPrecio4").is(":checked")){
			if(!regExpNum.test($("input[name=precio8]").val())) {
				mostrarDialogo("Error: campo de tiempo compartido incorrecto","El campo de tiempo compartido debe ser numérico, sin puntos ni coma!","input[name=precio8]");
				return "NO";
			}
		}
		if(!regExpNum.test($("#superficie").val())) {
			mostrarDialogo("Error: superficie incorrecta","El campo de superficie debe ser numérico, sin puntos ni coma","#superficie");
			return "NO";
		}
		if(!regExpLetras.test($("#descripcion").val())) {
			mostrarDialogo("Error: falta descripción","El campo descripción de la propiedad debe especificar algo.","#descripcion");
			return "NO";
		}
		if(!regExpLetras.test($("#contacto").val())) {
			mostrarDialogo("Error: falta contacto","El campo contacto de la propiedad debe especificar algo.","#contacto");
			return "NO";
		}

		for (i=1;i<=total;i++) {
			if(!regExpLetras.test($("#subircaract2 input[name=caract"+i+"]").val())) {
				if (i<7) {
					mostrarDialogo("Error: característica "+i+" vacía","La característica "+i+" de la propiedad no puede estar vacía.","#subircaract2 input[name=caract"+i+"]");
				} else {
					mostrarDialogo("Error: característica "+i+" vacía","La característica "+i+" de la propiedad no puede estar vacía, de lo contrario elimínela.","#subircaract2 input[name=caract"+i+"]");
				}
				return "NO";
			}
		}
		return "OK"; // Si todo está correcto
	} else { //si no es el formulario 2, hace lo siguiente
		if(!regExpLetras.test($("#tituloNuevaProp").val())) {
			mostrarDialogo("Error: título vacío","El campo título de propiedad debe contener caracteres alfabéticos o numéricos.","#tituloNuevaProp");
			return "NO";
		}
		if($("#selectorZona1 option:selected").val()=="0") {
			mostrarDialogo("Error: falta zona","Debe seleccionar una zona a la propiedad.","#selectorZona1");
			return "NO";
		}
		if($("#selectorPartido1 option:selected").val()=="0") {
			mostrarDialogo("Error: falta partido","Debe seleccionar un partido a la propiedad.","#selectorPartido1");
			return "NO";
		}
		if($("#selectorBarrio1 option:selected").val()=="0") {
			mostrarDialogo("Error: falta barrio","Debe seleccionar un barrio a la propiedad.","#selectorBarrio1");
			return "NO";
		}
		// Checkbox
		if($("#incluirMapa1").is(":checked")) {
			if (regExpLetras.test($("#dirPropiedad").val())==false) {
				mostrarDialogo("Error: falta dirección","La dirección no debe estar vacía, de lo contrario destilde la opción de agregar el mapa.","#dirPropiedad");
				console.log(regExpLetras.test($("#dirPropiedad").val())+"  "+$.trim($("#dirPropiedad").val()));
				return "NO";
			}
			if (regExpLetras.test($("#locPropiedad").val())==false) {
				mostrarDialogo("Error: falta localidad","La localidad no debe estar vacía, de lo contrario destilde la opción de agregar el mapa.","#locPropiedad");
				return "NO";
			}
		}
		if($("#agregPrecio1").is(":checked")) {
			if(!regExpNum.test($("input[name=precio1]").val())) {
				mostrarDialogo("Error: campo de venta incorrecto","El campo de venta debe ser numérico, sin puntos ni coma!","input[name=precio1]");
				return "NO";
			}	
		}
		if($("#agregPrecio2").is(":checked")){
			if(!regExpNum.test($("input[name=precio2]").val())) {
				mostrarDialogo("Error: campo de alquiler incorrecto","El campo de alquiler debe ser numérico, sin puntos ni coma!","input[name=precio2]");
				return "NO";
			}
		}
		if($("#agregPrecio3").is(":checked")){
			if(!regExpNum.test($("input[name=precio3]").val())) {
				mostrarDialogo("Error: campo de alquiler temporario incorrecto","El campo de alquiler temporario debe ser numérico, sin puntos ni coma!","input[name=precio3]");
				return "NO";
			}
		}
		if($("#agregPrecio4").is(":checked")){
			if(!regExpNum.test($("input[name=precio4]").val())) {
				mostrarDialogo("Error: campo de tiempo compartido incorrecto","El campo de tiempo compartido debe ser numérico, sin puntos ni coma!","input[name=precio4]");
				return "NO";
			}
		}
		if(!regExpNum.test($("#nuevaSup").val())) {
			mostrarDialogo("Error: superficie incorrecta","El campo de superficie debe ser numérico, sin puntos ni coma","#nuevaSup");
			return "NO";
		}
		if(!regExpLetras.test($("#nuevaDesc").val())) {
			mostrarDialogo("Error: falta descripción","El campo descripción de la propiedad debe especificar algo.","#nuevaDesc");
			return "NO";
		}
		if(!regExpLetras.test($("#nuevoCont").val())) {
			mostrarDialogo("Error: falta contacto","El campo contacto de la propiedad debe especificar algo.","#nuevoCont");
			return "NO";
		}
		for (i=1;i<=c;i++) {
			if(!regExpLetras.test($("#subircaract input[name=caract"+i+"]").val())) {
				if (i<7) {
					mostrarDialogo("Error: característica "+i+" vacía","La característica "+i+" de la propiedad no puede estar vacía.","#subircaract input[name=caract"+i+"]");
				} else {
					mostrarDialogo("Error: característica "+i+" vacía","La característica "+i+" de la propiedad no puede estar vacía, de lo contrario elimínela.","#subircaract input[name=caract"+i+"]");
				}
				return "NO";
			}
		}
		return "OK";
 	}
}

if ((validaForm(elemento2))=="OK") {

....

}
En realidad antes hice un return boolean (false/true) en caso de que la expresión regular sea inválida y muestra un diálogo (function mostrarDiálogo(valor1,valor2,valor3)), pero aunque escribas bien siempre devuelve false. Entonces decidí probar con el console.log y un return de String en vez de boolean dentro del if (cuando es inválida) a ver que valor devuelve y devuelve true, o sea que está bien la exp. reg.!!! Cómo es posible eso??
¿Por qué? ¿Tal vez haya un conflicto con los true/false de test y con el return en caso de que sea inválido y termina devolviendo cualquier valor?

Especialmente tengo problemas con expresiones regulares de letras a partir de Dirección (con el primero, que es el título anda bien), con el de números anda perfecto parece.

¿En caso de tener varios input's que revisar con expresiones regulares, cuál es la mejor forma para que revise y en caso de encontrar un input inválido, que muestre un alert y que no siga los if's restantes? Tal vez usando if's anidados?

No sé si me explico bien, me está volviendo loco o todavía no logro comprender el problema.

Saludos.