你可以使用正则表达式来解析它吗?
string uri = "website.com/stuff/?referrerPage=1&productID=1234567&tab=Tile";
var rgx = new Regex("productID=(?<pid>[0-9]+)", RegexOptions.IgnoreCase);
string pid = rgx.Match(uri).Groups[1].Value;
编辑:提供上下文,正如我应该做的那样:
提及此选项的原因是,虽然它不使用HttpUtility.ParseQueryString
,但您最初的问题非常具体:
只获取产品ID
从
用户访问的最后一页
(我理解这不是当前请求的 uri)。此外,您提供的 Uri 以字符串格式提供。
您问题中的方法是这样做的:
- 接受 Uri(一个
string
变量)
- 传递给
UriBuilder
; UriBuilder
在其构造函数中初始化 a Uri
,它本身通过创建更多字符串等来验证 uri、填充属性等大量工作
- 然后,从
Uri
生成的对象中,您现在可以使用该Query
属性 - 这是Uri
已分配的新字符串之一
- 传递给
HttpUtility.ParseQueryString
. 这会创建一个HttpValueCollection
,它本身会逐个字符地迭代您传入的字符串以解析出查询字符串中的键值对,并将它们粘贴到 NameValueCollection 中,最终将您的值存储在一个ArrayList
- 最少的.NET 中的高效集合(请参阅各种参考资料,包括这个 - What's Wrong with an ArrayList?),因为它将所有内容都存储在对象数组中,每次取出时都需要强制转换。
- 最后,您可以通过密钥搜索该集合以获取您的产品ID。
这是一大堆字符串和字符分配,对象之间的转换,将事物放入索引数组中然后扫描等等,只是为了获得:
虽然我承认内存很便宜,但似乎可能有同样好的或更好的替代方案。这就是正则表达式的用途 - 在字符串中找到一个模式,并允许您将该模式的一部分取出。
所以,你的选择:
- 如果您只想以精确的形式从 uri 中获取 productID,并且 uri 最初是在字符串中,那么我认为正则表达式是一个非常好的、有效的选择。如果您想从 uri 中提取其他模式,这也将起作用。
- 如果您想知道查询字符串中的所有键以及特定键的值,请使用您的
HttpUtility.ParseQueryString
方法;允许您通过属性NameValueCollection
访问密钥。AllKeys
- 如果您想获取当前请求的 uri 的查询字符串参数的值,那么 Marcianin 的答案是最简单的选择,您可以忘记前两个选项。
在所有情况下,一旦您有了字符串,您就可以使用 int 上的 parse 方法对其进行解析,但如果您使用 2. 或 3. 您提取的 id 可能不是数字(在恶意请求的情况下),因此请确保您使用int.TryParse
notint.Parse
从字符串转换,并小心捕获异常。在从查询字符串中获取输入时,您应该始终小心,以免与查询字符串中的恶意数据(一旦在线就会频繁访问您的网站)发生冲突。
选择是个人喜好。
- 您编写的实际代码大致相同——每种方法只占用很少的几行代码。
- 代码永远不应该过早地优化,但如果它可以帮助它也不应该故意浪费。您可以对另一个进行性能测试,但这会浪费您在此阶段的时间。
- 但是,代码也应该传达意图。即使我认为,Regex 方法也不能像 ParseQueryString 方法那样传达您的意图。
脚注:我会稍微更改正则表达式"[?&]productID=(?<pid>[0-9]+)"
以确保您只选择“productID”而不是“fooProductID”
最重要的是,你问
我的代码在正确的轨道上吗?
我会说你是。在您继续进行时,请始终权衡不同的选项。不要害怕尝试不同的东西。你说你是 C# 的新手。在这种情况下,您可能错过的一件事是在编写代码之前编写一个测试来帮助您:如果测试通过,则代码是正确的,您选择的方法是次要的。如果您使用的是最新版本,Visual Studio 可以让您轻松进行测试。如果您尽早养成良好的习惯,它将在您以后的 C# 职业生涯中获得回报。
如何将产品 ID 号放入某个东西以便我可以使用它?
格兰特托马斯完美地回答了这个问题 - int.TryParse 将字符串转换为数字。