Necesito una expresión regular que valide cualquiera de los siguientes formatos:

  • + 10%
  • -123
  • +5.5
  • +50
  • 99
  • 99,99
  • -20%
  • 25% (esto no debe ser validado)

(% sin ningún + o - no debe validarse)

Intenté usar preg_match('/^[+-]?(\d+\.)?(\d+)[%]?$/', $value) pero esto también valida 25%.
¿Alguien puede compartir expresiones regulares que valida el formato anterior?

2
MagePsycho 19 dic. 2019 a las 09:03

2 respuestas

Podría mantenerlo simple aquí y usar una alternancia:

^(?:[+-]?\d+(?:\.\d+)?|[+-]\d+(?:\.\d+)?%)$

Demo

La parte difícil de su requisito es que el signo inicial es opcional para un número sin porcentaje, pero obligatorio para un porcentaje. La alternancia facilita la separación de estas dos preocupaciones.

2
Tim Biegeleisen 19 dic. 2019 a las 06:19

Puede hacerlo utilizando sub-patrón condicional en PCRE que evita repetir el patrón de coincidencia de números enteros nuevamente en alternancia:

^([+-])?\d+(?:\.\d+)?(?(1)%)?$

Demo de RegEx

Detalles de RegEx:

  • ^: Iniciar
  • ([+-])?: coincide con + o - en el grupo opcional # 1
  • \d+: Match 1+ dígitos
  • (?:\.\d+)?: Coincide con el punto seguido de 1+ dígitos en un grupo opcional sin captura
  • (?(1)%)?: subpatrón condicional. Si el grupo # 1 está presente, haga coincidir % como coincidencia opcional.
  • $: Fin
2
anubhava 19 dic. 2019 a las 07:06