Patrick Mlr Patrick Mlr - 4 years ago 122
PHP Question

Regex get all matches in one match

I'm searching for a regex that matches all words, but will give only one match.

What I have:




Regex:
(.*\={1})\d+(\D*)


Input:
max. Money (EU)=600000 Euro


Output:
Euro





This works fine, but it's possible that the Input is like this:
max. Money (EU)=600000 Euro plus 20000 for one person
.

Before the
=
could be anything, the only thing that I know is that the
=
is fixed. So every input have this.

So I'm searching for a regex that will give me for this input this output:
Euro plus for one person
.

I tried to use a regex like
(\D+)
, but I'll get for this input 3 matches. Does someone know how to get all occurences in one match?

Answer Source

One cannot match discontinuous text with 1 match operation.

The easiest workaround is to capture the whole substring after = + number, and then remove numbers from the match with preg_replace('~\s*\d+~', '', $m[1]).

See the PHP demo:

$re = '/=\d+\s*(.*)/';
$str = 'max. Money (EU)=600000 Euro plus 20000 for one person';
$res = '';
if (preg_match($re, $str, $m)) {
    $res = preg_replace('~\s*\d+~', '', $m[1]);
}
echo $res; // => Euro plus for one person

Since you mention that a = does not have to be followed by 1+ digits, you may really just explode the string at the first = and then remove digits in the second item:

$chunks = explode("=", $str, 2);
if (count($chunks) == 2) {
    $res = preg_replace('~\s*\d+~', '', $chunks[1]);
}

See this PHP demo.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download