从PHP中的URL提取查询字符串参数值的正则表达式

从PHP中的URL提取查询字符串参数值的正则表达式,php,preg-match,Php,Preg Match,我需要从URL中提取项目id;模式是这样的 &R=10031004&,我的意思是,我需要提取&R=中的字符串和另一个字符串& 到目前为止,这就是我所拥有的,但我不断地犯错误 preg_match('^[&R=]+ &$', "http://www.lapdirecciondemario.com/items.php&R=10031004&", $matches); $host = $matches[0]; echo $host; 首先也许我可以简化你的任务 这是

我需要从URL中提取项目id;模式是这样的 &R=10031004&,我的意思是,我需要提取&R=中的字符串和另一个字符串&

到目前为止,这就是我所拥有的,但我不断地犯错误

preg_match('^[&R=]+ &$',
"http://www.lapdirecciondemario.com/items.php&R=10031004&", $matches);
$host = $matches[0];

echo $host;

首先也许我可以简化你的任务

这是脚本中的url吗

然后您应该检查$\u GET的内容,在那里您将找到一个包含10031004内容的变量R

$item_id = $_GET['R']; 
echo $item_id; 

首先也许我可以简化你的任务

这是脚本中的url吗

然后您应该检查$\u GET的内容,在那里您将找到一个包含10031004内容的变量R

$item_id = $_GET['R']; 
echo $item_id; 
使用以下命令:

preg_match('/&R\=(.*?)&/i', "http://www.lapdirecciondemario.com/items.php&R=10031004&", $matches);
echo $matches[1]; // will echo 10031004
使用以下命令:

preg_match('/&R\=(.*?)&/i', "http://www.lapdirecciondemario.com/items.php&R=10031004&", $matches);
echo $matches[1]; // will echo 10031004
if(preg)匹配('/(?
if(preg)匹配('/(?)?
与其他答案相反,如果参数
R
前面有
而不是
&
,这也会匹配。如果您了解更多关于数字长度的信息,可以将
+
之后的
+
替换为
{min,max}

此正则表达式应该非常健壮,并与以下所有表达式匹配:

与其他答案相反,如果参数
R
前面有
而不是
&
,这也会匹配。如果您了解更多关于数字长度的信息,可以将
+
之后的
+
替换为
{min,max}

此正则表达式应该非常健壮,并与以下所有表达式匹配:


我还不如向你扔另一个。这一个将匹配以?或?开头的R=和以&或#结尾的任何字符


我还不如扔另一个给你。这一个将匹配以?或?开头的R=和以&或#结尾的任何字符

我无法测试它,但它应该可以工作

我无法测试它,但它应该可以工作



您的模式缺少分隔符-这是一个无效的模式。您的模式缺少分隔符-这是一个无效的模式。我认为他正在删除网站:)我认为他正在删除网站:)为什么让简单的事情看起来复杂?:)为什么捕获不需要的东西?:)为什么让简单的事情看起来复杂?:):)为什么要捕获不需要的内容?:)我以前不知道
#
。谢谢。@middus,只要
分隔符不能是字母数字或反斜杠,它几乎可以是任何东西。例如,试试
~
甚至
*
。我以前不知道
#
。谢谢。@middus,只要
分隔符不能是字母数字或反斜杠,它几乎可以是任何东西。例如,试试
~
甚至
*
。@middus我回答了OP的问题,要求将字符串设置在&R=和&之间,因此不需要对其他字符串执行正则表达式。是的,我知道。但是OP提供的URL可能无效。@middus我回答了OP的问题,要求获取介于&R=和&之间的字符串,因此没有必要对其他字符串执行正则表达式。是的,我知道。但是OP提供的URL可能无效。如果id应该是数字,这不会增加值。是的,但他的问题说他必须“提取&R=和另一个&”中的字符串,因此我的答案更精确。您的答案将匹配
http://www.lapdirecciondemario.com/items.php&R=1003/IamtheWalrus/1004&
,这可能不是他想要的,或者是吗?你的正则表达式返回1003。地雷返回“1003/Imathewalrus/1004”。根据问题的措辞,我的观点更为正确。另一方面,这种输入是荒谬的,对LapdirecionDemario.com的R的含义来说,两者都不可能有用。没有“更正确的”,只有正确和不正确。如果我们假定id为数字,则此URL不应匹配。如果我们对id了解得更多,我们可以指定
{min,max}
(参见我的答案)以进一步避免误报。如果id应该是数字的,这不会增加值。是的,但他的问题是他必须“提取&R=内的字符串,另一个&”,所以我的答案更准确。你的答案会匹配
http://www.lapdirecciondemario.com/items.php&R=1003/IamtheWalrus/1004&
,这可能不是他想要的,或者是吗?您的正则表达式返回1003。地雷返回“1003/Imathewalrus/1004”。根据问题的措辞,我的观点更为正确。另一方面,这种输入是荒谬的,对LapdirecionDemario.com的R的含义来说,两者都不可能有用。没有“更正确的”,只有正确和不正确。如果我们假定id为数字,则此URL不应匹配。如果我们知道更多关于id的信息,我们可以指定
{min,max}
(参见我的答案),以进一步避免误报。
$url = 'http://www.lapdirecciondemario.com/items.php&R=10031004&';
preg_match('/(&|\?)R=([0-9]+)/i', $url, $matches);
echo $matches[2];
preg_match('/[?&]R=([^&#]+)/', "http://www.lapdirecciondemario.com/items.php&R=10031004&", $matches);
$url = "http://www.lapdirecciondemario.com/items.php&R=10031004&";
$urlQueryParts = array();
parse_str(parse_url($url, PHP_URL_QUERY), $urlQueryParts);
if(isset($urlQueryParts[ "R" ]))
    $urlQueryParts[ "R" ];