PHP preg_match - что не так с этим регулярным выражением?

StackOverflow https://stackoverflow.com/questions/1479133

  •  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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top