Регулярное выражение для разделения строк из файла

У меня может быть такая строка

BK0001 PHP and MySQL Web Development (4th Edition) $49.95 (Clearance Price!)

или же
BK0013 Wanna be a Master at PHP? (Free!)

Я хочу разделить как [BK0001] ][PHP and MySQL Web Development (4th Edition)] [$49.95] [(Clearance Price!)]
или же
[BK0013] [Wanna be a Master at PHP?] [(Free!)]
Я использую регулярное выражение:

$re = '~^(?<id>\S+)\s+(?<title>.*?)\s+(?<price>\$\d[\d.]*)\s*(?<clearance>.*)$~';

Однако, когда используется в моем коде,

 foreach ($bookFile as $book) {
$re = '~^(?<id>\S+)\s+(?<title>.*?)\s+(?<price>\$\d[\d.]*)\s*(?<clearance>.*)$~';
if (preg_match($re, $book, $parts)) {
$b_price = substr($parts['price'], 1);
$bookObj = new Book($parts['id'], $parts['title'], number_format($b_price, 2), $parts['clearance']);
array_push($bookList, $bookObj);
}
}

Я не могу получить бесплатные книги. Как я могу также получить бесплатные книги с помощью регулярных выражений?

0

Решение

Поскольку это помогло вам, я выложу выражение:

'~^(?<id>\S+)\s+(?<title>.*?)(?:\s+(?<price>\$\d[\d.]*))?\s*(?<clearance>\([^()]*\))$~'

Увидеть regex demo

подробности

  • ^ — начало строки
  • (?<id>\S+) — Группа «id»: 1+ непробельные символы
  • \s+ — 1+ пробельные символы
  • (?<title>.*?) — Группа «title»: любые 0+ символов, как можно меньше
  • (?:\s+(?<price>\$\d[\d.]*))? — необязательная группа:
    • \s+ — 1+ пробельные символы
    • (?<price>\$\d[\d.]*) — Группа «Прайс»: $, цифра, а затем 0+ цифр или .
  • \s* — 0+ пробелов
  • (?<clearance>\([^()]*\)) — Группа «Распродажа»: (, 0+ символов кроме ( а также ) а потом )
  • $ конец строки.
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector