Как разделить эту строку с preg_match_all в php? - PullRequest
2 голосов
/ 24 апреля 2019

Мне нужно разделить строки, как:

Некоторое описание арт. Номер: 4457 72 1x ACOUCH 90X200 NICE GREY (3 колли) 1x матра 85x205x12 2x матра 80x190x11 Некоторые спецификации 14x Премиум другой продукт 90x200x23 HR34

Результат, который мне нужен:

  1. Некоторое описание арт. Номер: 4457 72
  2. 1x ACOUCH 90X200 NICE GREY (3 colli)
  3. 1x матра 85x205x12
  4. 2x матра 80x190x11 Некоторые характеристики
  5. 14x Премиум другой продукт 90x200x23 HR34

Чтобы сделать его более сложным, первая часть является дополнительной, нодругие части всегда начинаются с «1x» или около того.

Я пробовал много регулярных выражений, но не могу заставить его работать.Я могу использовать preg_split () с чем-то вроде /\s?\d+x\s/ в качестве обходного пути, но это действительно грязно, хотя и неплохо разбивается.

Даже когда я пытаюсь разбить части 2 на 5, я не могу сделать это правильно.

Я пробовал много регулярных выражений с preg_match_all () в php на наименее сложной строке:

1x ACOUCH 90X200 NICE GREY (3 colli) 1x matras 85x205x12 2x matras 80x190x11 Некоторые спецификации 14x Premium Другой продукт 90x200x23 HR34

Следующие шаблоны были наиболее близкими:

  • /(\d+x\s+.+?)(\s+(\d+x\s+.+?(?!\s\d+x\s)))+/i
  • /(\d+x\s+.+)(\s+(\d+x\s+.+))+/i

Я думаю, что это должно быть что-то вроде: /((\s+)?(\d+x\s+.+(?!\s\d+x\s)))+/i, но это не делает работу.

А простые, такие как /(\s?\d+x\s+.+)+/i просто возвращают полную строку или только первые символы /(\s?\d+x\s+.+?)+/i

Я пробовал эти (и многие другие варианты) на:

Что я делаю не так?Это сводит меня с ума;это действительно не мое первое регулярное выражение!

(и как заставить его работать на полную строку с необязательной первой частью)

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 24 апреля 2019

Почему бы вам не использовать это регулярное выражение для разбиения вместо столь сложных?

\s+(?=\d+x\s+)

Regex Demo

Демонстрационный код PHP

$s = "Some description art.nr: 4457 72 1x ACOUCH 90X200 NICE GRAY (3 colli) 1x matras 85x205x12 2x matras 80x190x11 Some specs 14x Premium otherproduct 90x200x23 HR34";
var_dump(preg_split("/\s+(?=\d+x\s+)/", $s));

печать

array(5) {
  [0]=>
  string(32) "Some description art.nr: 4457 72"
  [1]=>
  string(36) "1x ACOUCH 90X200 NICE GRAY (3 colli)"
  [2]=>
  string(19) "1x matras 85x205x12"
  [3]=>
  string(30) "2x matras 80x190x11 Some specs"
  [4]=>
  string(39) "14x Premium otherproduct 90x200x23 HR34"
}
2 голосов
/ 24 апреля 2019

Просто разделить на

(?=\b\d+[xX]\b)

См. демо на regex101.com .

1 голос
/ 24 апреля 2019

Скучный способ выполнения регулярных выражений Pushpesh:

$str = "Some description art.nr: 4457 72 1x ACOUCH 90X200 NICE GRAY (3 colli) 1x matras 85x205x12 2x matras 80x190x11 Some specs 14x Premium otherproduct 90x200x23 HR34";

$words = explode(" ", $str);
$i = 0;
foreach($words as $word){
    if(preg_match("/^\d+x$/", $word)){
        $i++;
    }
    $array[$i][] = $word;
}

foreach($array as $words){
    $split[] = implode(" ", $words);
}

var_dump($split);

Вывод:

array(5) {
  [0]=>
  string(32) "Some description art.nr: 4457 72"
  [1]=>
  string(36) "1x ACOUCH 90X200 NICE GRAY (3 colli)"
  [2]=>
  string(19) "1x matras 85x205x12"
  [3]=>
  string(30) "2x matras 80x190x11 Some specs"
  [4]=>
  string(39) "14x Premium otherproduct 90x200x23 HR34"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...