我需要分割字符串,例如:
某些描述art.nr:4457 72 1x ACOUCH 90X200尼斯灰色(3 colli)1x matras 85x205x12 2x matras 80x190x11一些规格14x Premium其他产品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
我在以下位置尝试了这些(以及许多其他变体):
我在做什么错?它让我疯狂;这真的不是我的第一个正则表达式!
(以及如何使它适用于带有可选的第一部分的完整字符串)
谢谢!
答案 0 :(得分:3)
您为什么不使用此正则表达式进行拆分,而不是使用这么复杂的正则表达式?
\s+(?=\d+x\s+)
$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)
答案 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"
}