У меня может быть такая строка
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);
}
}
Я не могу получить бесплатные книги. Как я могу также получить бесплатные книги с помощью регулярных выражений?
Поскольку это помогло вам, я выложу выражение:
'~^(?<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+ символов кроме (
а также )
а потом )
$
конец строки.Других решений пока нет …