javascript - 正则表达式捕获尽可能多的 Javascript 重定向

标签 javascript python regex redirect

我试图从许多 HTML 页面中捕获尽可能多的 Javascript 重定向。我的正则表达式是:

((location.href)|(window.location)|(location.replace)|(location.assign))(( ?= ?)|( ?\( ?))("|')([^'"]*)("|')( ?\) ?)?;

我使用 Python,但问题很笼统:

regex = re.compile(r"""((location.href)|(window.location)|(location.replace)|(location.assign))(( ?= ?)|( ?\( ?))("|')([^'"]*)("|')( ?\) ?)?;""", re.I)
# ... some control here ...
print re.search(regex, html).group(10)  # 10 is the pure url

我做了一些测试,我能够捕捉到所有这些情况。

location.href = "http://www.foo.com";
location.href="http://www.foo.com";
window.location = "http://www.foo.com";
window.location.href = "http://www.foo.com";
location.replace ("http://www.foo.com");
location.replace( "http://www.foo.com" ) ;
location.assign ("http://www.foo.com");

并跳过我无法解析 URL 的地方,因为代码包含一个变量:

location.href = "http://www.foo.com" + var + "something else";

问题是:

  1. 还有其他方法可以使用 Javascript 进行重定向吗?我缺少的其他 location.somethingelse
  2. 我捕捉这 4 个案例的方式是否正确?是否允许使用类似 location.href = http://www.foo.com;location.replace (http://www.foo.com); 我会因为(双)引号而错过?我是太严格了还是太松懈了?
  3. 我的正则表达式写得好吗?或者我可以通过某种方式改进它吗?

最佳答案

一般来说,您不能使用正则表达式解析编程语言(好吧,理论上是 you can ,但这是非常不切实际的)。对于 javascript 尤其如此,因为它具有高度动态的特性。例如,

 window['loc' + 'a' + 'tion'][['h','r','e','f'].join('')] = 'something'.replace(/s/, etc...)

也就是说,这里有一个表达式至少可以通过您的测试(为清楚起见进行了分解):

# quoted string
str = r"""
    ' (?:\\.|[^'])* '
    |
    " (?:\\.|[^"])* "
"""
# dotted reference to "location"
loc = r"""
    (?: \w+\.)*
    \b location \b
    (?: \.\w+)*
"""

# ref=string or ref(string)
expr = r"""
    ({0})
    \s*
    (?:
        = \s* ({1})
        |
        \( \s* ({1}) \s* \)
    )
    \s*
    ;
""".format(loc, str)

在扩展模式下编译它,例如

expr = re.compile(expr, re.X)

关于javascript - 正则表达式捕获尽可能多的 Javascript 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13363174/

相关文章:

javascript - 在 javascript/Angular 中扩展对象

javascript - ng-model 未在嵌套指令中更新

javascript - 需要将 Prev/Next 切换添加到选项卡脚本

python - 如何通过使用python在spark中使用参数化的多列创建分区?

javascript - 数组/HTML 中的函数

python - 列的子集和过滤器 Pandas

python - 使用 Azure Active Directory 进行身份验证 - 如何以编程方式接受用户凭据

sql - 如何在postgres中提取第一个和剩余的单词

c# - 进行多个字符串替换的更快方法

java - 使用正则表达式在字符串中搜索子字符串