PHP:preg_replace()获取NameSpace的“父”组件

How can I use the preg_replace() replace function to only return the parent "component" of a PHP NameSpace?

Basically:

Input: \Base\Ent\User; Desired Output: Ent

I've been doing this using substr() but I want to convert it to regex. Note: Can this be done without preg_match_all()?

Right now, I also have a code to get all parent components:

$s = '\\Base\\Ent\\User';
print preg_replace('~\\\\[^\\\\]*$~', '', $s);
//=> \Base\Ent

But I only want to return Ent.

Thank you!

As Rocket Hazmat says, explode is almost certainly going to be better here than a regex. I would be surprised if it's actually slower than a regex.

But, since you asked, here's a regex solution:

$path = '\Base\Ent\User';
$search = preg_match('~([^\\\\]+)\\\\[^\\\\]+$~', $path, $matches);
if($search) {
    $parent = $matches[1];
}
else {
    $parent = ''; // handles the case where the path is just, e.g., "User"
}
echo $parent; // echos Ent

How about

$path = '\Base\Ent\User';
$section = substr(strrchr(substr(strrchr($path, "\\"), 1), "\\"), 1);

Or

$path = '\Base\Ent\User';
$section = strstr(substr($path, strpos($path, "\\", 1)), "\\", true);

I think maybe preg_match might be a better choice for this.

$s = '\\Base\\Ent\\User';
$m = [];
print preg_match('/([^\\\\]*)\\\\[^\\\\]*$/', $s, $m);
print $m[1];

If you read the regular expression backwards, from the $, it says to match many things that aren't backslashes, then a backslash, then many things that aren't backslashes, and save that match for later (in $m).