Разделить строку на несколько частей с помощью регулярных выражений

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

BK0001 My book (4th Edition) $49.95 (Clearance Price!)

Я хотел бы, чтобы способ разделить его на разные части, такие как

[BK0001]
[My Book (4th Edition)]
[$49.95]
[(Clearance Price!)]

Я довольно новичок в регулярных выражениях, и я использую это для анализа строки в файле. Мне удалось получить первую часть BK0001 используя

$parts = preg_split('/\s+/', 'BK0001 My book (4th Edition) $49.95 (Clearance Price!)';

затем получить $part[0] значение, но не уверен, как разделить его, чтобы получить другие значения.

2

Решение

Вы можете сопоставить определенные части входной строки, используя один шаблон с группами захвата:

preg_match('~^(?<code>\S+)\s+(?<name>.*?)\s+(?<num>\$\d[\d.]*)\s*(?<details>.*)$~', $text, $matches)

Увидеть regex demo. На самом деле, последний $ не требуется, это просто, чтобы показать, что вся строка соответствует.

подробности

  • ^ — начало строки
  • (?<code>\S+) — Группа «код»: один или несколько непробельных символов
  • \s+ — 1+ пробелов
  • (?<name>.*?) — Группа «имя»: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \s+ — 1+ пробелов
  • (?<num>\$\d[\d.]*) — Группа «Num»: $затем 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!)
3

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

Попробуйте использовать preg_match

$book_text = "BK0001 My book (4th Edition) $49.95 (Clearance Price!)";
if(preg_match("/([\w\d]+)\s+(.*?)\s+\\((.*?)\\)\s+(\\$[\d\.]+)\s+\\((.*?)\\)$/",$book_text,$matches)) {
//Write code here
print_r($matches);
}

$ match [0] зарезервировано для строки полного совпадения. Вы можете найти разделенные части из $ match [1] …

Array ( [0] => BK0001 My book (4th Edition) $49.95 (Clearance Price!) [1] => BK0001 [2] => My book [3] => 4th Edition [4] => $49.95 [5] => Clearance Price! )

$matches[1] is "book number"$matches[2] is "book name"$matches[3] is "edition"$matches[4] is "price"$matches[5] is "special text"
3

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