/ / dejar de hacer coincidir la cadena en expresiones regulares después de mi patrón - php, regex

dejar de hacer coincidir la cadena en expresiones regulares después de mi patrón - PHP, expresiones regulares

Estoy tratando de hacer coincidir un patrón de cadena y mi expresión regular es

/^[a-zA-Z0-9]*(-|s)*Iphone 7(s|-)?(p{N}GB)?B/i

Y la cadena con la que estoy tratando de emparejar es Apple Iphone 7 Plus 16 Gb. Quiero hacer coincidir la expresión regular exacta, es decir, el iPhone 7 solo debe coincidir con el siguiente

  • [cualquier dígito o cadena] apple iphone 7
  • [cualquier dígito o cadena] apple iphone 7 16 gb
  • [cualquier dígito o cadena] apple iphone 7 32GB - Plateado
  • [cualquier dígito o cadena] apple iphone 7 plus (no debe coincidir)
  • [cualquier dígito o cadena] apple iphone 7s (no debe coincidir)

Por favor, hágamelo saber lo que estoy haciendo mal? Aqui esta regex enlazar

Respuestas

1 para la respuesta № 1

No estoy seguro de entender bien tu necesidad, pero ¿qué te parece?

/^.*?iphone 7(?:s+(?:pluss+)?d+s?gb.*)?$/i

Explicación:

/               : regex delimiter
^             : begining of string
.*?         : 0 or more any characters not greedy
iphone 7    : literally
(?:         : start non capture group
s+       : 1 or more spaces
(?:       : start non capture group
plus    : literally
s+     : 1 or more spaces
)?        : end group^, optional
d+       : 1 or more digits
s?       : 1 optional space
gb        : literally
.*        : 0 or more any character
)?          : end group, optional
$             : end of string
/i              : regex delimiter, case insensitive

En acción:

$tests = array(
"any digits or string apple iphone 7",
"any digits or string apple iphone 7 16 gb",
"any digits or string apple iphone 7 32GB - Silver",
"any digits or string apple iphone 7 plus",
"any digits or string apple iphone 7s",
);
foreach ($tests as $test) {
echo "$testt ==> ";
if (preg_match("/^.*?iphone 7(?:s+(?:pluss+)?d+s?gb.*)?$/i", $test)) {
echo "matchn";
} else {
echo "doesn"t matchn";
}
}

Salida:

any digits or string apple iphone 7  ==> match
any digits or string apple iphone 7 16 gb    ==> match
any digits or string apple iphone 7 32GB - Silver    ==> match
any digits or string apple iphone 7 plus     ==> doesn"t match
any digits or string apple iphone 7s     ==> doesn"t match

0 para la respuesta № 2

Si realmente solo te interesa el Apple Iphone 7 poco de la cadena, y estás usando PHP, ¿por qué no simplemente hacer:

if (stripos($string,"Apple Iphone 7 Plus") !== FALSE) echo "Wow a 7 Plus!";
else if (stripos($string,"Apple Iphone 7") !== FALSE) echo "It is only a 7";

En otras palabras: evite usar expresiones regulares complejas cuando pueda, y solo úselas cuando sean necesarias.


0 para la respuesta № 3

Con esta expresión regular puede hacer coincidir y también, si lo desea, puede extraer alguna información al respecto

(?!apple iphone .* plus)(?:apple iphone 7)(?>s(?<storage>d+)?s?(?:gb))?

Puedes ver el manifestación

He actualizado un poco, ahora coincidirá con lo siguiente

  • [cualquier dígito o cadena] apple iphone 7
  • [cualquier dígito o cadena] apple iphone 7 16 gb
  • [cualquier dígito o cadena] apple iphone 7 32GB
  • [cualquier dígito o cadena] apple iphone 7 [cualquier dígito o cadena]
  • [cualquier dígito o cadena] apple iphone 7 16 gb [cualquier dígito o cadena]
  • [cualquier dígito o cadena] apple iphone 7 32GB [cualquier dígito o cadena]

No coincidirá con lo siguiente

  • [cualquier dígito o cadena] apple iphone 7 plus
  • [cualquier dígito o cadena] apple iphone 7 más [cualquier dígito o cadena]
  • [cualquier dígito o cadena] apple iphone 7 16 gb más
  • [cualquier dígito o cadena] apple iphone 7 16 gb más [cualquier dígito o cadena]
  • [cualquier dígito o cadena] apple iphone 7 32GB más [cualquier dígito o cadena]