【问题标题】:PCRE to find all urls without file extensions that include #, ?, & etcPCRE 查找所有没有文件扩展名的 url,包括 #、? 等
【发布时间】:2021-09-20 17:02:18
【问题描述】:

非常菜鸟问题 - 有以下我用来查找没有以下扩展名的任何网址(似乎有效):

href="\S*(?i)(?<!\.html)(?<!\.pdf)(?<!\.doc)(?<!\.docx)(?<!\.ppt)(?<!\.pptx)(?<!\.xls)(?<!\.xlsx)(?<!\.jpg)(?<!\.jpeg)(?<!\.eps)"

我苦苦挣扎的地方是试图弄清楚如何找到带有扩展名的文件名并排除,例如: test.html#help test.html?help test.html?help&please

不知道如何采用类似(?<!\.html) 并添加通配符来处理 .html 之后的任何内容

通过在线正则表达式测试器站点进行了更多测试,这似乎有效 - 匹配任何文件扩展名,包括 test.html#help 等:
href="\S*(?i)(((?<=\.html)\S*)|((?<=\.pdf)\S*)|((?<=\.doc)\S*)|((?<=\.ppt)\S*)|((?<=\.xls)\S*)|((?<=\.jpg)\S*)|((?<=\.jpeg)\S*)|((?<=\.eps)\S*))"

但这根本不起作用: href="\S*(?i)((?<!\.html)\S*)"

非常感谢任何帮助。

【问题讨论】:

    标签: regex pcre


    【解决方案1】:

    这对你有用吗?

    href="(?<url>.+?\.(?!(html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)).*?)"
    

    https://regex101.com/r/SPjvkR/1

    • href=" 与字符 href=" 逐字匹配(区分大小写)
    • 命名捕获组 url (?&lt;url&gt;.+?\.(?!(html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)).*?)
      ?&lt;url&gt; 是捕获组的名称。如果您不希望捕获组有名称,则可以省略它,或者可以将其替换为 ?: 以使其成为非捕获组。命名可以如果需要,只需在以后的代码中更方便地获取组的值,但在你的情况下,我认为这并不重要
    • .+? 匹配任何字符(行终止符除外)一次到无限次,尽可能少,根据需要扩展(惰性)
    • \. 匹配字符 . 与索引 4610(2E16 或 568)字面意思(区分大小写)
    • 负前瞻(?!(html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)) 断言下面的正则表达式不匹配
      • 第二捕获组(html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)
    • .*? 匹配零到无限次之间的任何字符(行终止符除外),尽可能少,根据需要扩展(惰性)
    • " 匹配字符 " 与索引 3410(2216 或 428)字面意思(区分大小写)

    更新

    基于 cmets 的新正则表达式

    href="((?!.*\.(?:html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)).*?)"
    

    Regex Demo

    • href=" 匹配字符 href=" 字面意思(区分大小写)
    • 第一捕获组((?!.*\.(?:html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)).*?)
      • 负前瞻(?!.*\.(?:html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)) 断言下面的正则表达式不匹配
        • . 匹配任何字符(行终止符除外)
        • * 匹配前一个令牌的次数在零次到无限次之间,尽可能多次,根据需要回馈(贪婪)
        • \. 匹配字符 。字面上的索引为 4610(2E16 或 568)(区分大小写)
        • 非捕获组(?:html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)
      • . 匹配任何字符(行终止符除外)
      • *? 匹配前一个令牌的次数介于零次和无限次之间,尽可能少,根据需要扩展(惰性)
    • " 按字面意思匹配索引为 3410(2216 或 428)的字符 "(区分大小写)

    【讨论】:

    • 丹尼尔-谢谢。它绝对有效。现在我只需要做一些阅读来了解它是如何/为什么实际工作的(这样我就不会一遍又一遍地问同样的问题)。
    • 我应该在我的原始请求中添加一些东西(我已经简单了,所以我会理解任何可能的答案)......你的解决方案效果很好 - 谢谢。正则表达式的最后一部分是有意义的 - \.(?!(html|xlsm|pdf|doc|ppt|jpg|jpeg|eps)).*? - 虽然不确定第一部分 - ?.+?。如果 URL 在 URL 中有额外的句点,我还需要能够处理 - 例如:test.test.html#help OR test.com/test.html
    • 我已经用一些额外的解释更新了我的答案。这有帮助吗?
    • 丹尼尔 - 这绝对有帮助。我的背景更多是 sql、vbscript、html、css 等。我需要学习很多东西——即使只是简单的东西。谢谢。
    • @gully53,我用一个新的(希望改进的)正则表达式为你更新了我的答案。告诉我进展如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多