I have a sample code:
$text = "240 x 400 pixels, 3.0 inches (~155 ppi pixel density)";
And using regex:
preg_match_all('/(.*)( x )(.*)/i', $text, $arr);
print_r($arr[0]);
Result not change, how to fix it ?
I'm guessing you want to change your regular expression to something like this:
preg_match_all('/(\d+) x (\d+)/i', $text, $arr);
The "." matches any character, so when you used .*
it just matched the whole string---it doesn't matter what you put after it. With regular expressions, it's generally a good rule of thumb to be as specific as possible. In this case \d+
will match 1 or more numeric digits, so it will stop matching when it gets to the first non-numeric digit, in this case, a space.
Here's the result of $arr
that I get with your $text
string and the updated regular expression:
Array
(
[0] => Array
(
[0] => 240 x 400
)
[1] => Array
(
[0] => 240
)
[2] => Array
(
[0] => 400
)
)
Hopefully it's closer to what you were looking for.
You may want this instead: /(\d+)\s*x\s*(\d+)/i
It will match a number \d+
, followed by arbitrary amount of spaces \s+
, then x
, then arbitrary amount of spaces, then another number \d+
. It also captures the numbers in the index 1 and index 2 of the match array.
/(\d+)(?:\sx\s)(\d+)/i
Use .
carefully.
This method will give you a key to access the width / height of these values. By using \d you're targeting digits only
$text = "240 x 400 pixels, 3.0 inches (~155 ppi pixel density)";
preg_match_all('/(?P<width>\d+) x (?P<height>\d+)/i', $text, $arr);
print_r($arr);exit;