正则表达式解析url参数

时间:2013-08-07 22:24:08

标签: php regex

我无法使用正则表达式从字符串中检索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之后的空格上结束

2 个答案:

答案 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&param=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修饰符以匹配不区分大小写。