PHP preg_match - что не так с этим регулярным выражением?
-
18-09-2019 - |
Вопрос
Значения будут в этом формате 123-123-123-123345, для которого я хотел бы, чтобы preg_match работал.Вы видите что-нибудь неправильное в этом регулярном выражении?
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 />";
}
}
тоже пробовали
/^\d{3}\-\d{3}\-\d{3}\-\d{5}+$/
//With and without the + before the $
Все они терпят неудачу с Бу - Ху ;(
Редактировать:
var_dump($elem)
array(3) { [0]=> string(1) "c" [1]=> string(0) "" [2]=> string(36) "123-123-123-12345" }
Решение
Пробуем этот код :
$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 />";
}
(Не уверен, что \
полезны - но, похоже, в данном конкретном случае они не вызывают никаких проблем)
Я получаю :
Yeah match Elm: 123-123-123-12345
И с этим :
$value = '123-123-1a-123';
Я получаю :
Boo Hoo Elm: '123-123-1a-123'
Регулярное выражение, кажется, действительно работает для меня ?
Не могли бы вы предоставить немного больше кода?Или, может быть, использовать :
var_dump($elem);
может быть, было бы полезно проверить, действительно ли он содержит то, что вы ожидаете?
Другие советы
Не могли бы вы, пожалуйста, предоставить какой-нибудь тестовый массив с данными (лучше всего было бы сериализованный), поскольку я не могу воспроизвести это поведение.
$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 />";
}
}
Результат:Да , совпадение с Вязом:123-123-123-12345
Кроме того, обратная косая черта не нужна в регулярном выражении.Тире нужно экранировать только в группах [], если они не являются первым символом ([-a-z] будет соответствовать "- ИЛИ a-z", но [a-z] будет соответствовать "a или \ или z").
--- РЕДАКТИРОВАТЬ ---
Итак, единственное, чего я не могу понять, это какую кодировку вы используете ?
string(36) "123-123-123-12345"
36 байт...Самое близкое, что я получил, - это UTF-16, но получилось всего 34 байта.Итак, какую кодировку вы используете?
Вы также можете попробовать преобразовать строку в utf-8 перед сопоставлением с регулярным выражением.(также попробуйте использовать параметр 'u' в регулярном выражении:'/somreg\d/u', после преобразования в utf-8)
Используйте двойную обратную косую черту.\
Ummmmmm....
В своей правке вы говорите о $массив и в вашем цикле о $элемент.
Может ли в этом быть проблема?
Редактировать: Кстати, с вашими данными что-то странное, я насчитал всего 17 символов, так почему is выдает строку (36)?
Невозможно воспроизвести.Ваш код отлично работает, когда я вставляю его в файл.
С тех пор, как ваш var_dump()
показывает, что ваша целевая строка составляет 35 байт для 15-символьной строки, хотя, похоже, у вас проблемы с кодировкой.Что произойдет, если вы запустите регулярное выражение против utf8_decode($value)
вместо того , чтобы $value
?