Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用regex for javascript获取url中查询字符串项的值_Javascript_Regex_String - Fatal编程技术网

使用regex for javascript获取url中查询字符串项的值

使用regex for javascript获取url中查询字符串项的值,javascript,regex,string,Javascript,Regex,String,我有一个包含产品ID的URL,其格式如下: 一个字母,后跟任意数量的数字,然后是下划线,然后是任意数量的数字和下划线 这是一个有效的产品id:c23\u 02398105,这也是:c23\u 02398105\u 9238714 当然,在URL中,它夹在其他查询字符串项之间,因此在此URL中,我只想提取id: http://www.mydomain.com/product.php?action=edit&id=c23_02398105&side=1 我一直在尝试一个正则表达式,

我有一个包含产品ID的URL,其格式如下:

一个字母,后跟任意数量的数字,然后是下划线,然后是任意数量的数字和下划线

这是一个有效的产品id:
c23\u 02398105
,这也是:
c23\u 02398105\u 9238714

当然,在URL中,它夹在其他查询字符串项之间,因此在此URL中,我只想提取id:

http://www.mydomain.com/product.php?action=edit&id=c23_02398105&side=1
我一直在尝试一个正则表达式,但都没有用:

/&id=[a-z]_[(0-9)*]&/
提取产品id的正确方法是什么

function qry(sr) {
  var qa = [];
  for (var prs of sr.split('&')) {
    var pra = prs.split('=');
    qa[pra[0]] = pra[1];
  }
  return qa;
}

var z = qry('http://example.com/product.php?action=edit&id=c23_02398105&side=1');
z.id; // c23_02398105

下面的命令返回每个键的一个值数组,因此如果您想获取下面的字符串,请使用一些分隔符(例如
params.id.join(','))将这些值连接起来,以获取逗号分隔的id字符串


处理:
  • 常规键/值对(
    ?param=value
  • 不带值的键(
    ?参数
    :无等号或值)
  • 带空值的键(
    ?参数=
    :等号,但等号右侧没有值)
  • 重复按键(
    ?参数=1和参数=2
  • 删除空键(
    ?&&&
    :无键或值)
代码:
如何致电:

您可以使用JavaScript字符串函数代替regexp,如下所示:

var url = "http://www.example.com/product.php?action=edit&id=c23_02398105&side=1";
var idToEnd = url.substring(url.search("&id")+4, url.length);
var idPure = idToEnd.substring(0, idToEnd.search("&"));
alert(idPure);

输出为
c23\u 02398105

以下表达式符合您的描述

/&id=([a-z]\d*_[\d_]*)/
它假定字母是小写的,并且url中只有一个指定格式的id,或者您想要的是第一个id

var url =
   'http://www.mydomain.com/product.php?action=edit&id=c23_02398105&side=1';

var m = url.match( /&id=([a-z]\d*_[\d_]*)/ );

console.log( m && m[1] );    // 'c23_02398105'

@安德烈亚斯:我也会指出答案,因为我认为被接受的答案可以做得更好(你提供的第二个链接)@user961627:http协议非常具体,正则表达式通常效率很低。随着web应用程序变得越来越脚本密集,您不希望尽可能最大化优化。有些人会称之为结束或微优化,但当你仍然支持IE7/IE8时,你会明白这是必要的。我还要补充一点,我的答案是@Andreas发布的链接中的一个修改的答案(我应该在那里更新),这可能有些过分,但更适合你的需要。可能足够短,可以得到你想要的,但不会处理多个ID,例如
http://www.mydomain.com/product.php?action=edit&id=c23_02398105&id=c24_40340343403&id=c23_23423423_23423423
见下文我的答案我没有投反对票,但你看过詹姆斯·帕多尔西的这篇文章吗@naveen我想不久以前——这很好,但问题是(1)regex效率不高,(2)如果你想要多个参数,他的方法效率不高,(3)可能有一段时间你不知道参数名,他的代码你必须提供密钥,而不是得到所有结果的列表,(4)有时,您希望将操作作为键(无值)传递,因此上面的代码会处理此问题,但his只会返回键的值,因此像
www.abc.com?doSomething
,我的url将显示
doSomething
存在,但有一个
未定义的
值his也将显示
未定义的
,但这与你是否尝试调用“doSomething”或“doesntReallyMatter”无关——因此,无论你试图检索什么,如果它没有价值,它总是显示
未定义的
。最后,我一直在朝着可可命名约定迈进;其中getter不使用
get
作为函数或方法名的一部分。因此,他们不建议使用
getParametersByName
,而是建议使用
parametersByName
——这会让我也更新函数名:),这听起来非常痛苦。为什么不直接分解?、&、和=上的字符串,以获得一个漂亮数组中的每个键值对@svnpenn可能最适合您的需要。这个答案的问题是,如果您有类似于
action=squid&id=…
,它将匹配squid中的
id
(您不想要的内容),并返回
id=c23
@罗德里戈·席尔韦拉有一个更好的观点。
key            ["value"]
keyemptyvalue  [""]
keynovalue     [undefined, "nowhasvalue"]
var url = "http://www.example.com/product.php?action=edit&id=c23_02398105&side=1";
var idToEnd = url.substring(url.search("&id")+4, url.length);
var idPure = idToEnd.substring(0, idToEnd.search("&"));
alert(idPure);
/&id=([a-z]\d*_[\d_]*)/
var url =
   'http://www.mydomain.com/product.php?action=edit&id=c23_02398105&side=1';

var m = url.match( /&id=([a-z]\d*_[\d_]*)/ );

console.log( m && m[1] );    // 'c23_02398105'