Php preg_match - o que há de errado com este regex?
-
18-09-2019 - |
Pergunta
Os valores estarão neste formato 123-123-123-12345 que eu gostaria que o Preg_match trabalhasse. Você pode ver algo errado com este regex?
foreach($elem as $key=>$value) {
// Have tried this With and without the + before the $ as well
if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) {
echo "Yeah match Elm: ".$value."<br />";
} else {
echo "Boo Hoo Elm: '".$value."'<br />";
}
}
também tentei
/^\d{3}\-\d{3}\-\d{3}\-\d{5}+$/
//With and without the + before the $
Todos eles falham com o boo hoo; (
EDITAR:
var_dump($elem)
array(3) { [0]=> string(1) "c" [1]=> string(0) "" [2]=> string(36) "123-123-123-12345" }
Solução
Tentando este código:
$value = '123-123-123-12345';
if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) {
echo "Yeah match Elm: ".$value."<br />";
} else {
echo "Boo Hoo Elm: '".$value."'<br />";
}
(Não tenho certeza do \
são úteis - mas eles não parecem causar problemas, neste caso em particular)
Eu recebo :
Yeah match Elm: 123-123-123-12345
E com isso:
$value = '123-123-1a-123';
Eu recebo :
Boo Hoo Elm: '123-123-1a-123'
O Regex realmente parece funcionar para mim?
Você poderia fornecer um pouco mais de código? Ou talvez use:
var_dump($elem);
Pode ser útil, para verificar se realmente contém o que você está esperando?
Outras dicas
Você poderia fornecer alguma matriz de teste com os dados (serializados seriam melhores), pois não posso reproduzir esse comportamento.
$elem = array ('123-123-123-12345');
foreach($elem as $key=>$value) {
// Have tried this With and without the + before the $ as well
if(preg_match("/^[0-9]{3}\-[0-9]{3}\-[0-9]{3}\-[0-9]{5}+$/", $value)) {
echo "Yeah match Elm: ".$value."<br />";
} else {
echo "Boo Hoo Elm: '".$value."'<br />";
}
}
Resultado: Sim Match Elm: 123-123-123-12345
Além disso, as barras de barriga não são necessárias na expressão regular. Os traços só precisam ser escapados em grupos [] se não forem o primeiro caractere ([-AZ] corresponderia "- ou AZ", mas [AZ] corresponderia a "A ou ou Z").
--- Edit ---
Ok, então a única coisa que não consigo entender é o que você está usando?
string(36) "123-123-123-12345"
36 bytes ... o mais próximo que cheguei é o UTF-16, mas obteve apenas 34 bytes. Então, qual é a codificação que você está usando?
Você também pode tentar converter a string para UTF-8 antes de corresponder com o Regexp. (Tente também usar o parâmetro 'u' no regexp: '/somreg d/u', depois de converter para o UTF-8)
Use barrafas duplas.
Ummmmmm ....
Em sua edição, você está falando $ matriz E em seu loop sobre $ elem.
Esse poderia ser o problema?
Editar: A propósito, há algo estranho com seus dados, conto apenas 17 caracteres, então por que está dando uma string (36)?
Incapaz de replicar. Seu código funciona bem quando eu o colo em um arquivo.
Desde o seu var_dump()
Mostra que sua sequência de destino é de 35 bytes para uma string de 15 caracteres, porém, parece que você tem problemas de codificação. O que acontece se você correr o regex contra utf8_decode($value)
ao invés de $value
?