删除 Excel 中的 URL 参数

Uts*_*aha 1 microsoft-excel-2007 string-manipulation microsoft-excel

我有以下形式的 URL:

http://www.example.com/page.html?param1=asdf&param2=asdfg&param3=asdfgh
Run Code Online (Sandbox Code Playgroud)

我想从 URL 中提取 param2 或 3 的值,并从 URL 中删除该特定参数。关于如何使用 Excel 执行此操作的任何想法?

Ind*_*rek 6

我不相信 Excel 具有处理 URL 的内置函数,因此您必须创造性地结合常规字符串操作函数,例如LEN(),MID()SEARCH()

假设您的 URL 在单元格中A1并且您要提取其值的参数在单元格中B1,请尝试以下公式。

要获取给定参数的值:

=IFERROR(MID(A1; SEARCH(B1 & "="; A1) + LEN(B1) + 1; IFERROR(SEARCH("&"; A1; SEARCH(B1 & "="; A1)) - SEARCH(B1 & "="; A1) - LEN(B1) - 1; LEN(A1))); "")
Run Code Online (Sandbox Code Playgroud)

要从 URL 中删除参数及其值:

=IFERROR(REPLACE(A1; SEARCH(B1 & "="; A1); IFERROR(SEARCH("&"; A1; SEARCH(B1 & "="; A1)) - SEARCH(B1 & "="; A1) + 1; LEN(A1)); ""); A1)
Run Code Online (Sandbox Code Playgroud)

注意:根据您的区域设置,您可能需要用逗号替换公式中的所有分号。


详细说明

要获取给定参数的值,我们首先需要在 URL 中定位它:

=SEARCH(B1 & "="; A1)
Run Code Online (Sandbox Code Playgroud)

SEARCH()函数在第二个参数(URL)中定位第一个参数(给定的参数)并返回它出现的起始位置的编号。请注意,我们在参数名称后附加了等号,以确保我们正在搜索正确的内容。否则搜索param1可能会返回位置,例如,param10如果它出现在 URL 中的较早位置。

找到参数后,我们需要返回 URL 的部分(或子字符串),从参数值的开始位置到下一个 & 符号之前结束。为此,我们使用该MID()函数,该函数接受三个参数:返回子字符串的字符串、开始的位置以及要返回的字符数。

=MID(A1; SEARCH(B1 & "="; A1); LEN(A1))
Run Code Online (Sandbox Code Playgroud)

我们还使用了该LEN()函数,它只返回给定字符串的长度(在本例中为 URL)。目前这只是一个占位符(第三个参数直到 Excel 2010 才成为可选参数),但稍后当我们需要最后一个参数的值时会派上用场。

首先,我们需要将起始位置从参数本身的开头移动到其值的开始位置。为此,我们将字符串的长度和 1(用于=符号)添加到参数在字符串中的位置。

=MID(A1; SEARCH(B1 & "="; A1) + LEN(B1) + 1; LEN(A1))
Run Code Online (Sandbox Code Playgroud)

更好的是,返回的值从正确的位置开始。为了让它停在正确的位置,我们需要找到下一个&符号,它表示下一个参数的开始位置。

=SEARCH("&"; A1; SEARCH(B1 & "="; A1))
Run Code Online (Sandbox Code Playgroud)

我们SEARCH()再次使用该函数,这次添加了第三个参数,指定开始搜索的位置 - 我们对给定参数之前的&符号不感兴趣,只对它后面的符号感兴趣。

为了从上面得到参数值的长度,我们需要减去参数开始的位置,参数的长度,再减去 1 作为=符号。

=SEARCH("&"; A1; SEARCH(B1 & "="; A1)) - SEARCH(B1 & "="; A1) - LEN(B1) - 1
Run Code Online (Sandbox Code Playgroud)

这适用于除最后一个参数之外的所有参数,因为 URL 末尾没有尾随与号。对于这种情况,我们可以使用该IFERROR()函数来检测 Excel 给出的错误,并返回一些固定数字。一个不错的选择是LEN(A1)- 字符串的长度保证大于其任何子字符串的长度,如果我们将其作为第三个参数传递给MID(),它将返回从给定位置到结尾的所有字符字符串,这正是我们所需要的。

=IFERROR(SEARCH("&"; A1; SEARCH(B1 & "="; A1)) - SEARCH(B1 & "="; A1) - LEN(B1) - 1; LEN(A1))
Run Code Online (Sandbox Code Playgroud)

结合上述,我们得到以下公式:

=MID(A1; SEARCH(B1 & "="; A1) + LEN(B1) + 1; IFERROR(SEARCH("&"; A1; SEARCH(B1 & "="; A1)) - SEARCH(B1 & "="; A1) - LEN(B1) - 1; LEN(A1)))
Run Code Online (Sandbox Code Playgroud)

最后一件事:如果B1包含在 URL 中不存在的参数,则上述返回#VALUE错误。在这种情况下要返回一个空字符串(或任何其他适当的值),请将整个内容包装在另一个中IFERROR()

=IFERROR(MID(A1; SEARCH(B1 & "="; A1) + LEN(B1) + 1; IFERROR(SEARCH("&"; A1; SEARCH(B1 & "="; A1)) - SEARCH(B1 & "="; A1) - LEN(B1) - 1; LEN(A1))); "")
Run Code Online (Sandbox Code Playgroud)

从 URL 中删除参数及其值的公式非常相似,使用该REPLACE()函数将 URL 的给定子字符串(其定义方式与上述大致相同)替换为空字符串。

您可以通过将常用块(如SEARCH(B1 & "="; A1))移动到它们自己的列并引用这些单元格而不是多次输入公式来稍微简化公式。然后可以从视图中隐藏这些额外的列。