我无法使用正则表达式从字符串中检索URL参数:
示例字符串可以是
some text and http://google.com/?something=this&tag=yahoo.com and more text
,我希望能够从中找到yahoo.com
。
需要注意的是,我需要确保字符串以http://google.com
开头,而不只是搜索&tag=(.*)
preg_match("/google\.com\/.*&tag=(.*) $/", $subject, $matches)
我希望这与google.com
后跟任何内容匹配,然后是&tag=
后跟空格。最终目标是解析tag=
个网址中的所有google.com
值。
有没有更好的方法来实现这一目标?
更新
所以我有这个新的正则表达式:/google\.com\/.*(tag=.*)/
但是我不知道如何让它在URL之后的空格上结束
答案 0 :(得分:4)
与parse_url()
函数友好对待!
$pieces = parse_url('some text http://google.com/?something=this&tag=yahoo.com and whatever');
$query = explode('&', $pieces['query']);
parse_str($pieces['query'], $get);
array_walk($get, function(&$item){
if (!$sp = strpos($item, ' ')) return;
$item = substr($item, 0, $sp);
});
var_dump($get); // woo!
编辑:感谢Johnathan的parse_str()
功能。
答案 1 :(得分:1)
如果您想获得tag
的值,那么以下正则表达式将完成这项工作:
$string = 'some text and http://google.com/?something=this&tag=yahoo.com
and more text
http://google.com/?something=this&tag=yahoo2.com¶m=test
';
preg_match_all('#http://google.com\S+&tag=([^\s&]+)#', $string, $m);
print_r($m[1]);
<强>输出强>
Array
(
[0] => yahoo.com
[1] => yahoo2.com
)
<强>解释强>
http://google.com
:匹配http://google.com
\S+
:匹配非空格一次或多次&tag=
:匹配&tag=
([^\s&]+)
:匹配除空格和&
之外的任何内容并对其进行分组如果需要,您甚至可以在s?
之后添加http
以考虑https
,或添加i
修饰符以匹配不区分大小写。