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 № 1No 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]