1

I'm new here and need your help. I want to match an string that is an URI - and get an array of substrings.

This is my input string:

/part-of-{INTERESETINGSTUFF}/an-url/{MORESTUFF}

I want this output array:

array(4) {
     [0]=>
     string(9) "/part-of-"
     [1]=>
     string(19) "{INTERESETINGSTUFF}"
     [2]=>
     string(8) "/an-url/"
     [3]=>
     string(11) "{MORESTUFF}"
}

I'm already able to preg_match everything with curly brackets by the pattern \{[^}]+\}. But how can I achieve my desired result?

Best regards!

Jonny
  • 23
  • 3

2 Answers2

1

What about this. See on regex101

\/.*?(?={|\/)\/?|{.*?}

Then store the matches in an array.

  • \/.*? matches all character following /
  • (?={|\/) stops match if next character is { or /
  • \/? match optional / at the end of match
  • {.*?} matches brackets and everything between
Nicolas
  • 6,611
  • 3
  • 29
  • 73
0

You can use a very simple ({[^{}]*}) regex matching {, zero or more symbols other than { and } with preg_split and PREG_SPLIT_DELIM_CAPTURE option (that will put all the captured subvalues into the resulting array):

$str = '/part-of-{INTERESETINGSTUFF}/an-url/{MORESTUFF}';
$res = array_filter(preg_split('/({[^{}]*})/', $str, -1, PREG_SPLIT_DELIM_CAPTURE));
print_r($res);
// => Array( [0] => /part-of-  [1] => {INTERESETINGSTUFF}  [2] => /an-url/ [3] => {MORESTUFF} )

See PHP demo

The array_filter is used to remove all empty elements from the resulting array.

Community
  • 1
  • 1
Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563