Регулярка. Парсинг размера

314
24 декабря 2016, 18:50

Есть такая регулярка:

/(\d{2,4})+|\s+(x|-|na|х|\s|на|)+|\s+(\d{2,4})/

Она на ура отрабатывает парсер размера 100 на 60 и т.п.

Но почему то она срабатывает и на строку: 100 руб

Как ее доработать чтобы она четко работала: цифры (разделитель) цена.

Спасибо. P.S: язык Php :)

Answer 1

Предлагаю

'/(\d+)\s*([\p{Pd}xх]|na|на)\s*(\d+)/u'

См. демо выражения

  • (\d+) - Группа 1: одна и более цифр
  • \s* - 0+ пробельных символов
  • ([\p{Pd}xх]|na|на) - разные дефисы (\p{Pd}), x, х, na или на
  • \s* - 0+ пробельных символов
  • (\d+) - Группа 3: одна и более цифр

Если числа могут быть дробными, можно добавить (?:[.,]\d+)? после \d+:

/(\d+(?:[.,]\d+)?)\s*([\p{Pd}xх]|na|на)\s*(\d+(?:[.,]\d+)?)/u

PHP:

$re = '/(\d+)\s*([\p{Pd}xх]|na|на)\s*(\d+)/u';
$str = '100 на 60, 100 руб';
preg_match_all($re, $str, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
    echo $m[1] . ", " . $m[2] . ", " . $m[3] . "\n";
}
// => 100, на, 60
READ ALSO
Если SELECT id != Null то id иначе INSERT

Если SELECT id != Null то id иначе INSERT

Описание проблемы: есть 2 таблицы tabel_home и table_users и они связаны 1 ко многим и при добавлении новой записи в таблицу tabel_home приходится проверять...

337
Пагинация для каждой статьи в codeigniter [требует правки]

Пагинация для каждой статьи в codeigniter [требует правки]

Как разбить страницу состоящую из тысяч строк текста на много страниц (пагинация) в codeigniter?

389
Как экранировать специальные символы?

Как экранировать специальные символы?

Уже не первый сталкиваюсь с тем, что, когда в поле с типом TEXT вместе с текстом записывается символ плюс (+), получаю не корректное поведениеЛибо...

360
PHP+ZipArchive+РусскийЯзык=Кракозябры

PHP+ZipArchive+РусскийЯзык=Кракозябры

ЗдравствуйтеПомогите решить проблему: есть zip-архив неизвестно где и как созданный, нужно распаковать все файлы во вложенную папку, причем...

372