Question

How would I use regular expression with PHP to split the following string into 2 pars as depicted below:

String to be split: 4x330ml

Split into 4x330 and ml

I have tried the following but it does not return the accurate data:

$pdata = "4x330ml"
$data = preg_split('#(?<=\d)(?=[a-z])#i', $pdata);

Then I get something like 4 in $data[0] and x330 in $data[1]

EDIT: Please note that ml could also be cm, kg, etc. A little complicated, which I don't seem to find a solution.

EDIT: Also I have tried the following regex (which I prefer to use at this point) with incomplete results:

$pdata = "5x500ml";
$data = preg_split('/(\d+\.?\d+)|(\w+)i/', $pdata);

This returns:

Array
(
    [0] => 5x
    [1] => ml
)

500 from that string is not being returned...

Thanks,

Was it helpful?

Solution 3

I'd use preg_match:

$pdata = "4x330ml";
preg_match('/(\d+x\d+)(.*)/',$pdata, $m);
print_r($m);

Output:

Array
(
    [0] => 4x330ml
    [1] => 4x330
    [2] => ml
)

OTHER TIPS

You said it could be ml, cm, or kg. and that you don't have to use regex. So, assuming it is always 2 characters at the end, a very simple way to do this would be:

$string = "4x330ml";
$part1 = substr($string, 0, -2); //returns 4x330
$part2 = substr($string, -2, 2); //returns "ml"

This ought to give you what you want.

$pdata = "4x330cm";

$data = preg_match('/([^(ml|cm|kg)]*)(ml|cm|kg)/', $pdata, $group);

echo $group[0].' ';
echo $group[1].' ';
echo $group[2].' ';

Use the preg_match function, and store the results into an array. The 0 index will return the entire matched string. The $group[1] will return just "4x330". The $group[2]$ will return just the "cm".

Assuming the units will always be 2 characters long you can use this

$pdata = "4x330ml";
$strNumber = substr($pdata, 0, strlen($pdata)-2);
$strUnit = substr($pdata, strlen($pdata)-2,2);
echo $strNumber;  //returns 4x330
echo $strUnit; //returns ml

you can do this without a regex

$string = '4x330ml';
$splitPoint = strrpos($string,'m');
$firstPart = substr($string,0,$string); //gets 4x330
$secondPart = substr($string,$splitPoint); //gets ml

I was able to solve this problem by using the following code:

$data = "4x500ml";
$pdata = preg_split('/(\d+x\d+)/', $data, NULL, PREG_SPLIT_DELIM_CAPTURE);

Which now prints:

array(
    [0] => 
    [1] => 4x500
    [2] => ml
)

It looks like it is capturing the delimeter as array[1] and since the delimeter is actually the first section of the string I want to split, it is fine for now, until I find a better solution.

Thank you all for trying.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top