Разделить строку на несколько частей с помощью регулярных выражений - PullRequest
0 голосов
/ 07 ноября 2018

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

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 ]

0 голосов
/ 07 ноября 2018

Попробуйте использовать 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"
0 голосов
/ 07 ноября 2018

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

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!)
...