Вы можете сопоставить определенные части входной строки, используя один шаблон с группами захвата:
preg_match('~^(?<code>\S+)\s+(?<name>.*?)\s+(?<num>\$\d[\d.]*)\s*(?<details>.*)$~', $text, $matches)
См. Демоверсию regex . На самом деле, последний $
не требуется, он просто показывает, что вся строка соответствует.
Подробнее
^
- начало строки
(?<code>\S+)
- группа «код»: один или несколько непробельных символов
\s+
- 1+ пробелов
(?<name>.*?)
- Имя группы: любые 0+ символов, кроме символов разрыва строки, как можно меньше
\s+
- 1+ пробелов
(?<num>\$\d[\d.]*)
- группа "num": a $
, затем 1 цифра и затем 0+ цифр или .
\s*
- 0+ пробелов
(?<details>.*)
- Группа "детали": любые 0+ символов, кроме символов разрыва строки, как можно больше
$
- конец строки.
PHP код :
$re = '~^(?<code>\S+)\s+(?<name>.*?)\s+(?<num>\$\d[\d.]*)\s*(?<details>.*)$~';
$str = 'BK0001 My book (4th Edition) $49.95 (Clearance Price!)';
if (preg_match($re, $str, $m)) {
echo "Code: " . $m["code"] . "\nName: " . $m["name"] . "\nPrice: " .
$m["num"] . "\nDetails: " . $m["details"];
}
Выход:
Code: BK0001
Name: My book (4th Edition)
Price: $49.95
Details: (Clearance Price!)