foreach($files as $file) {
$xname = basename($file['name'],'.jpg');
$tmp = preg_split("/[\s,-]+/",$xname,-1, PREG_SPLIT_NO_EMPTY);
echo "<pre>";
print_r($tmp);
echo "</pre>";
here is the example string "LR-147-TKW FLOWER RECT MIRROR FRAME"
I have this line of code that splits my string to arrays. What i want it do is to get the first 3 words which is "LR-147-TKW" and store it to a variable. how can i achieve this?
my array output is this 0] => BR
[1] => 139
[2] => TKW
[3] => DRESSER
[4] => BUFFET
[5] => MIRROR
You can use explode(), here are some examples:
<?php
$str = 'LR-147-TKW FLOWER RECT MIRROR FRAME';
$parts = explode(' ',$str);
print_r($parts);
/*
Array
(
[0] => LR-147-TKW
[1] => FLOWER
[2] => RECT
[3] => MIRROR
[4] => FRAME
)
*/
$serial_parts = explode('-',$parts[0]);
print_r($serial_parts);
/*
Array
(
[0] => LR
[1] => 147
[2] => TKW
)
*/
$full = array_merge($serial_parts,$parts);
print_r($full);
/*
Array
(
[0] => LR
[1] => 147
[2] => TKW
[3] => LR-147-TKW
[4] => FLOWER
[5] => RECT
[6] => MIRROR
[7] => FRAME
)
*/
?>
this actually does the trick for you current input. $tmp will contain LR-147-TKW after you execute this line of code:
list($tmp) = explode(' ', $input);
This is because preg_split("/[\s,-]+/",... splits your string where ever a comma, minus or space occurs. Change it to preg_split("/[\s,]+/",...) and it should give you the correct array.
Note that if you do that, your function won't split words like WELL-SPOKEN. It will become one entry in your array.
Considering your string has same pattern.
$str = "LR-147-TKW FLOWER RECT MIRROR FRAME";
$str1 = explode(' ',$str);
echo $str1[0];
How about using explode :
$arr = explode(' ',$file);
echo arr[0];
using preg_split is a bit of overkill for such a simple task...
If you want to avoid the array, it can be done using strpos and substr:
$pos = strpos($file, ' ');
echo substr('abcdef', 0, $pos);
add to your code:
$tmp = array_slice($tmp,0,3);
Related
Hello :) I am a beginner in PHP.
I tried several times but did not succeed
I would like to parse a String like :
[1,[01,11,12],[20,21,22]]
to
`
arr[0][0]=>1
arr[1][0]=>01
arr[1][1]=>11
arr[1][2]=>12
arr[2][0]=>20
arr[2][1]=>21
arr[2][2]=>22
`
You can split your string on a comma that is not enclosed by [ and ] using this regex (inspired by this answer) with preg_split:
,(?![^\[]*\])
and then trim surrounding [ and ] from the resultant parts and split those strings on commas into succeeding elements of the output array. For example:
$string = '[1,[01,11,12] ,4 ,5, [20,21,22]]';
$parts = preg_split('/,(?![^\[]*\])/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
$output = array();
foreach ($parts as $part) {
$part = trim($part, '[] ');
$output[] = explode(',', $part);
}
print_r($output);
Output:
Array
(
[0] => Array
(
[0] => 1
)
[1] => Array
(
[0] => 01
[1] => 11
[2] => 12
)
[2] => Array
(
[0] => 4
)
[3] => Array
(
[0] => 5
)
[4] => Array
(
[0] => 20
[1] => 21
[2] => 22
)
)
Demo on 3v4l.org
If you're 100% certain of the source and safety of the string, you can also just use eval:
eval("\$output = $string;");
The result will be the same.
I want to extract values from a string to call an array for basic template functionality:
$string = '... #these.are.words-I_want.to.extract# ...';
$output = preg_replace_callback('~\#([\w-]+)(\.([\w-]+))*\#~', function($matches) {
print_r($matches);
// Replace matches with array value: $these['are']['words-I_want']['to']['extract']
}, $string);
This gives me:
Array
(
[0] => #these.are.words-I_want.to.extract#
[1] => these
[2] => .extract
[3] => extract
)
But I'd like:
Array
(
[0] => #these.are.words-I_want.to.extract#
[1] => these
[2] => are
[3] => words-I_want
[4] => to
[5] => extract
)
Which changes do I need to make to my regex?
It seems that the words are simply dot separated, so match sequences of what you don't want:
preg_replace_callback('/[^#.]+/', function($match) {
// ...
}, $str);
Should give the expected results.
However, if the # characters are the boundary of where the matching should take place, you would need a separate match and then use a simple explode() inside:
preg_replace_callback('/#(.*?)#/', function($match) {
$parts = explode('.', $match[1]);
// ...
}, $str);
You can use array_merge() function to merge the two resulting arrays:
$string = '... #these.are.words-I_want.to.extract# ...';
$result = array();
if (preg_match('~#([^#]+)#~', $string, $m)) {
$result[] = $m[0];
$result = array_merge($result, explode('.', $m[1]));
}
print_r($result);
Output:
Array
(
[0] => #these.are.words-I_want.to.extract#
[1] => these
[2] => are
[3] => words-I_want
[4] => to
[5] => extract
)
i have strings that looks similar like this:
"size:34,35,36,36,37|color:blue,red,white"
is it possible to match all the colors in a preg_match(_all)?
so that i will get "blue", "red" and "white" in the output array?
the colors can be whatever, so i cant go (blue|red|white)
Explode on |
Explode on :
Explode on ,
???
Profit!
Code
IMHO using regular expressions like what's been suggested in the other answers is a much "uglier" solution than something simple like so:
$input = 'size:34,35,36,36,37|color:blue,red,white|undercoating:yes,no,maybe,42';
function get_option($name, $string) {
$raw_opts = explode('|', $string);
$pattern = sprintf('/^%s:/', $name);
foreach( $raw_opts as $opt_str ) {
if( preg_match($pattern, $opt_str) ) {
$temp = explode(':', $opt_str);
return $opts = explode(',', $temp[1]);
}
}
return false; //no match
}
function get_all_options($string) {
$options = array();
$raw_opts = explode('|', $string);
foreach( $raw_opts as $opt_str ) {
$temp = explode(':', $opt_str);
$options[$temp[0]] = explode(',', $temp[1]);
}
return $options;
}
print_r(get_option('undercoating', $input));
print_r(get_all_options($input));
Output:
Array
(
[0] => yes
[1] => no
[2] => maybe
[3] => 42
)
Array
(
[size] => Array
(
[0] => 34
[1] => 35
[2] => 36
[3] => 36
[4] => 37
)
[color] => Array
(
[0] => blue
[1] => red
[2] => white
)
[undercoating] => Array
(
[0] => yes
[1] => no
[2] => maybe
[3] => 42
)
)
You can achieve it in a round about way with preg_match_all() but I'd recommend explode instead.
preg_match_all('/([a-z]+)(?:,|$)/', "size:34,35,36,36,37|color:blue,red,white", $a);
print_r($a[1]);
I think it's possible with lookbehind:
/(?<=(^|\|)color:([^,|],)*)[^,|](?=\||,|$)/g
(for preg_match_all)
Your explode solution is obviously cleaner :-)
i have string like this
$string = '$foo$wow$123$$$ok$';
i want to return empty string and save string in array like this
0 = foo
1 = wow
2 = 123
3 =
4 =
5 = ok
i use PREG_SPLIT_NO_EMPTY, i know when make PREG_SPLIT_NO_EMPTY return is not empty, but i want any result empty, i want my result save in variable array like in PREG_SPLIT_NO_EMPTY with $chars[$i];
this is my preg_split :
$chars = preg_split('/[\s]*[$][\s]*/', $string, -1, PREG_SPLIT_NO_EMPTY);
for($i=0;$i<=5;$i++){
echo $i.' = '.$chars[$i];
}
i want, my result show with looping. no in object loop i want pure this looping:
for($i=0;$i<=5;$i++){
echo $i.' = '.$chars[$i];
}
to show my result.
how i use this preg_split,
thanks for advance...
use explode
$str = '$foo$wow$123$$$ok$';
$res = explode ("$",$str);
print_r($res);
Array
(
[0] =>
[1] => foo
[2] => wow
[3] => 123
[4] =>
[5] =>
[6] => ok
[7] =>
)
Using explode adds the empty entrys to the front and the back.
This one matches the tc's expected output:
$str = '$foo$wow$123$$$ok$';
preg_match_all("#(?<=\\$)[^\$]*(?=\\$)#", $str, $res);
echo "<pre>";
print_r($res);
echo "</pre>";
[0] => Array
(
[0] => foo
[1] => wow
[2] => 123
[3] =>
[4] =>
[5] => ok
)
I have a string like this
abcabdabeaf
Now I want to split it into a sequence of 'a', 'b' and any characters follow after the string 'ab' like this
Array
(
[0] => a
[1] => b
[2] => c
[3] => a
[4] => b
[5] => d
[6] => a
[7] => b
[8] => eaf
)
My current attempt is
$string = "abcabdabeaf";
$split = preg_split("/((?<=a)b)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r($split);
But the result is
Array
(
[0] => a
[1] => b
[2] => ca
[3] => b
[4] => da
[5] => b
[6] => eaf
)
Is it possible to do so with regex?
Personally I find it easier to think of this problem in terms of matching instead of splitting:
Match a (if followed by b)
Match b (if it follows a)
Match anything else until 'ab' or end of string is encountered
In code:
preg_match_all('/a(?=b)|(?<=a)b|.*?(?=ab|$)/', $s, $matches);
// note that $matches[0] has an empty array element at the end
This would work too, albeit a bit more verbose than I'd like:
$final = array(); $first = true;
foreach (explode('ab', $s) as $part) {
if ($first) {
$first = false;
} else {
$final[] = 'a';
$final[] = 'b';
}
$final[] = $part;
}
Why do you want to use regular expressions? explode() is right down your alley.
<?php $k = "abcabdefabcabcgfgdgdfabde";
var_dump(explode("ab",$k));
?>
You will get an empty element if your string starts with ab. To rememdy it, simply array_shift the array!