【问题标题】:How to match a script link?如何匹配脚本链接?
【发布时间】:2015-09-29 13:52:30
【问题描述】:

在 PowerShell 中,我尝试在 <script> 块上使用正则表达式,并尝试使用 jQuery 链接获取所有脚本标签的列表。所有变体,如

<script type="text/javascript" src="..." />
<script type="text/javascript" src="..."></script>

还有不同类型的引号,例如单引号或双引号。

当我匹配它时,我想将它们全部匹配(全局),然后打印出所有脚本标签(如上所示)。到目前为止我有这个:

if (($contents -match "src=(.*jquery.*\.js)") -eq $true) {
    write-host "$($matches[1]) found at $($web.Url)/$url (CONTENTLINK)";
    write-host "";
}

但它不能正常工作。我不认为它得到了所有的匹配,并且打印的部分比脚本标签更准确。我该怎么做?

注意:这是 PowerShell 1。

【问题讨论】:

  • 您能否发布一个包含您想要匹配的所有标签的 HTML sn-p,然后向我们展示您真正想要的输出是什么,以及当前的输出是什么?你也说这不是powershell 2.0,那是哪个版本?
  • 我还想指出,虽然我可能会尝试使用正则表达式来做到这一点,但我强烈建议您使用use an HTML parser instead, as I recommend in this answer
  • 我没有确切的 html sn-p,因为它从大约几百页收集它们。
  • 另外,我怎样才能遍历所有匹配项?
  • 您可以选择数百个文件中的任何一个。如果您无法提供要匹配的内容、MVCE 或当前代码的实际结果,那么您可能无法获得答案。

标签: regex powershell powershell-1.0


【解决方案1】:

.* 的使用是所有人第一次学习正则表达式的首选;遗憾的是,它有副作用,最终导致挫败感和正则表达式操作缓慢。

我认为它没有得到所有匹配项,并且打印的部分比脚本标签更准确

副作用之一是它消耗一切,我的意思是一切。


这是我相信你想要的脚本

src=\x22(?=.*jquery)([^\x22]+)\x22

解释

  • src= - 未捕获但匹配的锚文本。 (在 match[0] 中找到但不匹配1
  • \x22 - " 字符的十六进制转义。更易于在文字正则表达式模式中使用。
  • (?= ) - 向前看。说“我不想匹配,除非我在我的前瞻中找到什么。如果没有找到,它会停止匹配。
  • (?=.*jquery) .*jquery 某处可能存在文本 . * 零次或多次,以及文字 jquery。如果未找到“jquery”,则停止处理。否则继续。
  • ([^\x22]+) - 我们知道我们将匹配 ( ) 的东西,所以任何字符 . 不是 ^ 引用 [^\x22] 消耗它 1 次或更多次 +
  • \x22 - 匹配但不使用 " 的最终锚文本以完成。前面的.* 处理也是一个硬停止。

测试(不是在 Powershell 中,而是在 .Net 中):

两个结果(找到匹配项)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2010-09-27
    • 1970-01-01
    • 2022-11-01
    • 2011-10-04
    • 2023-01-12
    • 2019-10-07
    相关资源
    最近更新 更多