latikas
latikas

Reputation: 127

How I get the string between two other strings using regular expressions in PHP?

I have very less experience in regexp. I want to get path

structural/designer/00-slider

in one group and name in the second group

00-slider

using regex.

Below is the statement,

{path:structural/designer/00-slider, name:00-slider}, {path:structural/00-1_1, name:00-1_1}, {path:elements/tab, name:tab}

I used this regex,

(.+?)path

I am getting following output,

Match 1
Full match  0-5 `{path`
Group 1.    0-1 `{`
Match 2
Full match  5-58    `:structural/designer/00-slider, name:00-slider}, path`
Group 1.    5-54    `:structural/designer/00-slider, name:00-slider}, `
Match 3
Full match  58-97   `:structural/00-1_1, name:00-1_1}, {path`
Group 1.    58-93   `:structural/00-1_1, name:00-1_1}, {`

How can I achieve this using regex?

Upvotes: 0

Views: 46

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626738

You may use

'~{path\s*:\s*(?<path>[^{}]*?), name:(?<name>[^{}]*)}~'

with preg_match_all. See the regex demo.

Details

  • {path - a literal {path substring
  • \s*:\s* - a colon enclosed with optional 0+ whitespace chars
  • (?<path>[^{}]*?) - Group "path": any 0+ chars other than { and }, as few as possible
  • , name: - a literal substring
  • (?<name>[^{}]*) - Group "name": any 0+ chars other than { and }, as many as possible
  • } - a } char.

PHP demo:

$re = '/{path\s*:\s*(?<path>[^{}]*?), name:(?<name>[^{}]*)}/m';
$str = '{path:structural/designer/00-slider, name:00-slider}, {path:structural/00-1_1, name:00-1_1}, {path:elements/tab, name:tab}';
if (preg_match_all($re, $str, $matches)) {
    print_r($matches['path']); echo "\n";
    print_r($matches['name']);
}

Paths:

Array
(
    [0] => structural/designer/00-slider
    [1] => structural/00-1_1
    [2] => elements/tab
)

Names:

Array
(
    [0] => 00-slider
    [1] => 00-1_1
    [2] => tab
)

Upvotes: 1

Related Questions