如何在PHP中使用preg_match_all拆分此字符串?

时间:2019-04-24 18:20:42

标签: php regex regex-lookarounds

我需要分割字符串,例如:

  

某些描述art.nr:4457 72 1x ACOUCH 90X200尼斯灰色(3 colli)1x matras 85x205x12 2x matras 80x190x11一些规格14x Premium其他产品90x200x23 HR34

我需要的结果是:

  1. 某些描述art.nr:4457 72
  2. 1x ACOUCH 90X200尼斯灰色(3 colli)
  3. 1个Matras 85x205x12
  4. 2x matras 80x190x11一些规格
  5. 14x优质其他产品90x200x23 HR34

为了使其更加复杂,第一部分是可选的,而其他部分总是以“ 1x”开头。

我尝试了许多正则表达式,但无法使其正常工作。我可以将preg_split()与类似/\s?\d+x\s/之类的方法一起使用,但这确实很脏,尽管它可以很好地拆分。

即使仅尝试将部分2分割为5,我也无法正确处理。

我用最少的复杂字符串在php中用preg_match_all()尝试了许多正则表达式:

  

1x ACOUCH 90X200尼斯灰色(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 个答案:

答案 0 :(得分:3)

您为什么不使用此正则表达式进行拆分,而不是使用这么复杂的正则表达式?

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

Regex Demo

PHP Code demo

$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"
}

答案 1 :(得分:2)

刚刚分裂

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

请参见a demo on regex101.com

答案 2 :(得分:1)

一种完成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"
}