开发者

Regex matching optional section

So I have two possible strings here for example.

/user/开发者_运维技巧name

and

/user/name?redirect=1

I'm trying to figure out the proper regex to match either with a result of:

Array ([0] => /user/name [1] => user [2] => name)

I think the part I'm having an issue with is that the question mark and the GET query after it are optional and will only be there some of the time. I've tried many different things and can't seem to come up with a regex to match the strings whether the ?** is there or not.


Don't use a regex,

Use parse_url(), and explode()

$result = parse_url("/here/is/a/path?query=string");
$pieces  = explode("/", $result['path']);


? is the "zero-or-one" quantifier. So you could append (\?.*)? to your regex, which will optionally match zero or one instances of a literal question-mark followed by any number of characters.


In regex you can specify something as optional using the ? parameter. So for instance, the regex n?ever matches ever and never.

In your case, you might want something like /([A-Za-z0-9]+)/([A-Za-z0-9]+)(\?redirect=1)?

This will match /.../... (given the "..." consist of letters and numbers) or /.../...?redirect=1

If there are more possible flags that could come after the question mark than simply redirect=1, try the more general:

/([A-Za-z0-9]+)/([A-Za-z0-9]+)(\?[A-Za-z0-9]+=[A-Za-z0-9]+)?(&[A-Za-z0-9]+=[A-Za-z0-9]+)*


preg_match('{^/(user)/(name)(?=\?redirect=1)?$}', $subject, $matches);

This is a look ahead assertion. It won't be included in the match itself.

But like the other answers suggest you shouldn't use regex to parse URLs. Just posting the actual answer to the specific question for completeness.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜