我尝试以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&?_-]))
无效,以及如何修复它?
即使我认为我只能选择一个答案,我真的很感谢所有人的帮助!
答案 0 :(得分:4)
您应该使用Negative Lookahead而不是负面反对。
preg_match_all('~https?://www\.test\.com/([a-z0-9]+\b)(?!/[\w?&=-])~i', $str, $matches);
print_r($matches[1]);
注意:您还需要在正则表达式中转义点.
。如果您只想获取网址的用户名部分,则可以使用一个捕获组,此处不需要三个。