PHP正则表达式中的否定断言

时间:2014-08-12 20:29:32

标签: php regex

我尝试以http://www.test.com/username/的形式查找所有用户名,但不是http://www.test.com/username/ANY_VALID_URL_PART形式的用户名。我tried the negative assertions in PHP,但失败了。

让内容为:

<a href="http://www.test.com/username1/show" http://www.test.com/username2/ http://www.test.com/username3 target="_blank">

我想在http://www.test.com/username/http://www.test.com/username中获取用户名部分但我也想忽略http://www.test.com/username/show中的用户名。我尝试了以下方法:

preg_match_all("/(https?:\/\/www.test.com)\/([A-Za-z]+[A-Za-z0-9]+)(?<!(\/[A-Za-z0-9&?_-]))/i", $input_lines, $output_array);

但结果是:

Array
(
[0] => Array
    (
        [0] => http://www.test.com/username1
        [1] => http://www.test.com/username2
        [2] => http://www.test.com/username3
    )

[1] => Array
    (
        [0] => http://www.test.com
        [1] => http://www.test.com
        [2] => http://www.test.com
    )

[2] => Array
    (
        [0] => username1
        [1] => username2
        [2] => username3
    )

)

有人能告诉我为什么(?<!(\/[A-Za-z0-9&?_-]))无效,以及如何修复它?

即使我认为我只能选择一个答案,我真的很感谢所有人的帮助!

1 个答案:

答案 0 :(得分:4)

您应该使用Negative Lookahead而不是负面反对

preg_match_all('~https?://www\.test\.com/([a-z0-9]+\b)(?!/[\w?&=-])~i', $str, $matches);
print_r($matches[1]);

注意:您还需要在正则表达式中转义点.。如果您只想获取网址的用户名部分,则可以使用一个捕获组,此处不需要三个。

Live Demo