tags:

views:

66

answers:

6

Suppose I have the following:

$string = "(a) (b) (c)";

How would I explode it to get the contents inside the parenthesis. If the string's contents were separated by just one symbol instead of 2 I would have used:

$string = "a-b-c";
explode("-", $string);

But how to do this when 2 delimiters are used to encapsulate the items to be exploded?

+4  A: 

You have to use preg_split or preg_match instead.

Example:

$string = "(a) (b) (c)";
print_r(preg_split('/\\) \\(|\\(|\\)/', $string, -1, PREG_SPLIT_NO_EMPTY));
Array
(
    [0] => a
    [1] => b
    [2] => c
)

Notice the order is important.

Artefacto
Hi, not very good at writing the regular expression rule needed to go inside the preg split function. How would that go to match the contents inside the ()?
Georgy
A: 

Perhaps use preg_split with an alternation pattern:

http://www.php.net/manual/en/function.preg-split.php

Gian
+3  A: 

If there is no nesting parenthesis, you can use regular expression.

$string = "(a) (b) (c)";
$res = 0;
preg_match_all("/\\(([^)]*)\\)/", $string, $res);
var_dump($res[1]);

Result:

array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

See http://www.ideone.com/70ZlQ

KennyTM
+3  A: 

If you know for a fact that the strings will always be of the form (a) (b) (c), with precisely one space between each pair of parentheses and with no characters at the beginning or end, you can avoid having to use regexp functions:

$myarray = explode(') (', substr($mystring, 1, -1));
Hammerite
A: 

If your delimiters are consistent like that, then you can do this

$string = "(a) (b) (c)";
$arr = explode(") (", $string);
// Then simply trim remaining parentheses off.
$arr[0] = trim($arr[0], "()");
end($arr) = trim($arr[0], "()");
Zane Edward Dockery
Why not trim first?
Andy E
Good point! Either way though, the OP can still explode on ") (" and get what he needs.
Zane Edward Dockery