Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Regular Expression Functions (Perl-Compatible) : preg_split

preg_split

Split string by a regular expression (PHP 4, PHP 5)
array preg_split ( string pattern, string subject [, int limit [, int flags]] )

Example 1732. preg_split() example : Get the parts of a search string

<?php
// split the phrase by any number of commas or space characters,
// which include " ", \r, \t, \n and \f
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");
?>

Example 1733. Splitting a string into component characters

<?php
$str
= 'string';
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>

Example 1734. Splitting a string into matches and their offsets

<?php
$str
= 'hypertext language programming';
$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);
?>

The above example will output:

Array
(
   [0] => Array
       (
           [0] => hypertext
           [1] => 0
       )

   [1] => Array
       (
           [0] => language
           [1] => 10
       )

   [2] => Array
       (
           [0] => programming
           [1] => 19
       )

)

Related Examples ( Source code ) » preg_split



Code Examples / Notes » preg_split

me

[Editor's Note: You can use php's wordwrap() to do the exact same thing]
This script splits a text into portions of a defined max. size, which will never be exceeded, and doesnt cut words. (Per portion it adds as many words as possible without exceeding the char-limit)
the only exception where a portion would be bigger than the limit, is when there's a word thats longer than the max_size, but you could quite easily change the script so it regards this.
<?
$str= 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
$max_size = 50;
$words = preg_split("/[\040]+/", $str, -1);
$r=0;
for($i=0; $i < count($words); $i++) {
if (strlen($line[$r] . $words[$i] . ' ') < $max_size) $line[$r] .= $words[$i] . ' ';
else
{
$r++;
$line[$r] .= $words[$i] . ' ';
}
}
print_r ($line);
?>
Result:
Array
(
   [0] => Lorem ipsum dolor sit amet, consectetur
   [1] => adipisicing elit, sed do eiusmod tempor
   [2] => incididunt ut labore et dolore magna aliqua. Ut
   [3] => enim ad minim veniam, quis nostrud exercitation
   [4] => ullamco laboris nisi ut aliquip ex ea commodo
   [5] => consequat. Duis aute irure dolor in
   [6] => reprehenderit in voluptate velit esse cillum
   [7] => dolore eu fugiat nulla pariatur. Excepteur sint
   [8] => occaecat cupidatat non proident, sunt in culpa
   [9] => qui officia deserunt mollit anim id est laborum.
)


jetsoft

To clarify the "limit" parameter and the PREG_SPLIT_DELIM_CAPTURE option,
$preg_split('(/ /)', '1 2 3 4 5 6 7 8', 4 ,PREG_SPLIT_DELIM_CAPTURE );
returns
('1', ' ', '2', ' ' , '3', ' ', '4 5 6 7 8')
So you actually get 7 array items not 4


dave

The above description for PREG_SPLIT_OFFSET_CAPTURE may be a bit confusing.
When the flag is or'd into the 'flags' parameter of preg_split, each match is returned in the form of a two-element array. For each of the two-element arrays, the first element is the matched string, while the second is the match's zero-based offset in the input string.
For example, if you called preg_split like this:
preg_split('/foo/', 'matchfoomatch', -1, PREG_SPLIT_OFFSET_CAPTURE);
it would return an array of the form:
Array(
 [0] => Array([0] => "match", [1] => 0),
 [1] => Array([1] => "match", [1] => 8)
)
Note that or'ing in PREG_DELIM_CAPTURE along with PREG_SPLIT_OFFSET_CAPTURE works as well.


steve

preg_split() behaves differently from perl's split() if the string ends with a delimiter. This perl snippet will print 5:
my @a = split(/ /, "a b c d e ");
print scalar @a;
The corresponding php code prints 6:
print count(preg_split("/ /", "a b c d e "));
This is not necessarily a bug (nowhere does the documentation say that preg_split() behaves the same as perl's split()) but it might surprise perl programmers.


crispytwo

I was having trouble getting the PREG_SPLIT_DELIM_CAPTURE flag to work because I missed reading the "parenthesized expression" in the documentation :-(  
So the pattern should look like:
/(A)/
not just
/A/
and it works as described/expected.


superzouz

Be advised
$arr = preg_split("/x/", "x" );
print_r($arr);
will output:
Array
(
   [0] =>
   [1] =>
)
That is it will catch the 2 empty string on each side of the delimiter.


Change Language


Follow Navioo On Twitter
Pattern Modifiers
Pattern Syntax
preg_grep
preg_last_error
preg_match_all
preg_match
preg_quote
preg_replace_callback
preg_replace
preg_split
eXTReMe Tracker