使用 Perl 正则表达式确定 URI 是否有效

2023-12-02

对于我正在开发的应用程序,我需要一个 Perl 脚本,它循环遍历大量 CSV 文件并确保每一行都包含有效的 URI。我之前已经问过一个关于解析 CSV 文件的问题,并且我已经开始使用Text::CSV让我的生活变得更轻松。现在我面临确保 URI 有效的问题。

由于我的应用程序的性质,URI 不需要采用完整的形式

protocol://username:[email protected]/request?vars=values

相反,我只对此的请求部分感兴趣。对于一般网站,这将是之后的任何内容.com, .edu, etc.

我目前有以下 Perl 脚本:

if($_ !~ /^(?:[a-z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*$/i){
    print "Invalid URL format";
    exit;
} else {
    /* stuff */
}

正则表达式应该相当简单。请求允许包含一小组符号中的一个([a-z0-9-._~!$&'()*+,;=:/?@]) 或者它可能包含百分号 (%) 后跟两个十六进制数字。这些模式中的任何一个都可以无限地重复。

当我运行此脚本时,出现以下错误:

Number found where operator expected at ./301rules.pl line 58, near "%[0"
        (Missing operator before 0?)
Bareword found where operator expected at ./301rules.pl line 58, near "9A"
        (Missing operator before A?)
Bareword found where operator expected at ./301rules.pl line 58, near "$/i"
        (Missing operator before i?)
syntax error at ./301rules.pl line 58, near "%[0"

很明显,我的正则表达式中的某些内容需要转义,但我不确定是什么。我尝试着逃避every创建以下正则表达式的可能符号:

if($_ !~ /^(?:[a-z0-9\-\.\_\~\!\$\&\'\(\)\*\+\,\;\=\:\/\?\@]|%[0-9A-F]{2})*$/i){

然而,当我这样做时,它只是允许every通过测试的字符串,即使是我知道无效的字符串,例如te%st or é

那么有没有人有 Perl 正则表达式的经验并且知道我需要转义什么以及我不应该转义什么?对于 19 个不同的符号,我不想尝试所有 2^19 = 524288 种可能性。

编辑-投票结束。我发现这个问题实际上就存在于这个循环之上,尽管我还不完全明白为什么。

I had:

if( $_ == "" ){
    next;
}
/* regex conditional from above */

无论出于何种原因,它不断评估为 true 并进入下一次迭代,尽管显然有数据存储在$_。我会弄清楚为什么会这样,但目前正则表达式可以很好地处理所有转义的内容。


在文档中URI module我发现了以下内容:

使用 REGEXP 解析 URI

作为该模块的替代方案, 以下(官方)常规 表达式可用于解码 网址:

    my($scheme, $authority, $path,
    $query, $fragment) =   $uri =~
    m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;

URI::Split 模块提供了 函数 uri_split() 作为可读的替代方案。

但我觉得正则表达式::通用::URI可能是 HTTP URI 语法验证的理想解决方案。

use Regexp::Common qw /URI/;
while (<>) {
    /$RE{URI}{HTTP}/  and  print "Contains an HTTP URI.\n";
}

任何由达米安(Damian)编写并由阿比盖尔(Abigail)维护的东西都必须是受启发的、伟大的、疯狂的,或者以上全部。 (我的意思是给予最高的敬意)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Perl 正则表达式确定 URI 是否有效 的相关文章

  • 为什么会出现使用警告;使用严格; Perl 中不是默认的吗?

    我想知道为什么 use warnings use strict Perl 中不是默认的 每个脚本都需要它们 如果有人 出于充分的理由 需要禁用它们 他们应该使用no strict和 或应该使用一些命令行参数 对于单行代码 是否有太多写得很糟
  • Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

    我正在编写一些通过 STDIN 与客户端进程通信的服务器代码 我正在尝试编写一段 Perl 代码 用于异步接收来自客户端 STDOUT 的响应 代码的阻塞版本可能如下所示 sub read from client my file handl
  • 如何在使用 Apache 2 的 Windows 上忽略 Perl shebang?

    我已经在我的 Windows 机器上设置了本地 Perl Web 环境 我正在开发的应用程序最初来自 Linux 服务器 因此源代码的 shebang pl文件看起来像这样 usr bin perl 这会导致我的 Windows 开发机器上
  • 有条件的正则表达式替换

    使用Python 您可以在替换文本之前检查组是否为空 Example user John Marshal gt user br strong Jonh Marshal strong John Marshal gt strong Jonh M
  • 使用 JavaScript 清理 SQL 数据

    我有一堆具有各种输入元素的表单 我想在服务器端清理这些 yes 我使用服务器端 JavaScript 将这些输入用作参数 并防止特殊字符格式错误 在你走之前 比如 这不属于 JavaScript 的领域 等等 我正在使用一个价值数百万美元的
  • 从谷歌街道地址中提取城市和州信息

    我有一个数据集 其中包含不同点位置的纬度 经度信息 我想知道与每个点关联的城市和州 按照此example https stackoverflow com questions 22911642 applying revgeocode to a
  • 替换文本区域的文字

    我制作了一个 javascript 函数来将文本区域中的某些单词替换为其他单词 但它不起作用 我做了这个 function wordCheck var text document getElementById eC value var ne
  • 如何避免正则表达式中除空格之外的所有特殊字符?

    我正在使用行过滤器构建自动完成编辑器 并且正在使用正则表达式删除特殊字符 但空格也被删除 Regex Regex Replace currentText 0 9A Za z 我只想忽略空格但替换剩余的特殊字符 只需在否定字符类中添加空格即可
  • 一系列 unicode 点的正则表达式 PHP

    我正在尝试从字符串中删除所有字符 除了 字母数字字符 美元符号 下划线 代码点之间的 Unicode 字符U 0080 and U FFFF 通过这样做 我得到了前三个条件 preg replace a zA Z d foo 我如何去满足第
  • 如何从用户提供的包含正则表达式元字符的字符串创建正则表达式?

    我需要使用创建正则表达式regexcrate 包含一个作为命令行参数传递给程序的字符串 命令行参数可以包含 and 如果我将字符串硬编码为r 那么它工作正常 但是如果我使用命令行参数作为format r arg str 我收到以下错误 假设
  • Perl 和 MySql 中的 utf8 编码

    我的数据库 MySql 有 utf8 general 排序规则 我正在从数据库访问数据并显示一个网页 用 Perl 开发 它显示瑞典语字符 和不同的字符 我检查了Mysql数据库 在那里我可以看到其中包含 字符的数据 看来 访问数据时存在编
  • 在javascript中使用正则表达式从字符串中提取子字符串

    我是 javascript 新手 如何提取与 javascript 字符串中的正则表达式匹配的子字符串 例如在Python中 version regex re compile r d d d line 2021 05 29 Version
  • Python:正则表达式 findall

    我使用 python 正则表达式从给定字符串中提取某些值 这是我的字符串 mystring txt sometext somemore text here some other text course course1 Id Name mar
  • 使用正则表达式在 g:TextField 中进行验证

    我正在开发 grails 应用程序 并且希望能够对 g textField 进行验证 我只是想确保数字是数字 单词是单词 我想避免通过 JS 来完成它 但如果这是唯一的方法 那就这样吧 这是我正在尝试的
  • 如何查询 sqlite 的某些行,即将其分为页面(perl DBI)

    抱歉我的菜鸟问题 我目前正在编写一个 Perl Web 应用程序 其背后有 sqlite 数据库 我希望能够在我的应用程序查询结果中显示可能会获得数千行的内容 这些应该分成页面 路由应该像 webapp N 其中 N 是页码 使用 DBI
  • PostgreSQL - 插入包含数组的复合类型数组

    我有一个包含 TEXT 数组等的复合类型 我在主表中使用它来创建复合类型的数组 如何生成 INSERT 命令 不使用复合类型的默认字段名称 我可以使用复合数组创建一个临时表 然后将其插入主表吗 例如 DROP TABLE collectio
  • 正则表达式替换“NO-BREAK SPACE”

    我正在寻找一个正则表达式来替换字符串中的 NO BREAK SPACE 有一些与 NO BREAK SPACE 相关的问题 但似乎没有一个问题能让我找到正确的答案 到目前为止 我尝试使用 字符串 AB 的第二个字符是不间断空格 但没有成功
  • git svn rebase 导致“字节顺序不兼容”错误

    以下是我尝试 git svn rebase 时遇到的错误 Byte order is not compatible at lib Storable pm autosplit into lib auto Storable retrieve a
  • Javascript:在文档中查找 URL

    如何在文档中查找 URL 即 www domain com 并将其放入锚点中 www domain com html Hey dude check out this link www google com and www yahoo com
  • 为什么 Perl 中不推荐使用 Switch 模块?

    为什么是Switch http search cpan org dist Switch module Perl 5 12 中已弃用 http search cpan org jesse perl 5 12 0 pod perl5120del

随机推荐

  • 带有 Ember CLI 插件的 SASS

    我想知道如何在 Ember CLI 插件中使用 SASS 我有我的风格 app styles文件夹 但我不确定这是否是放置它们的正确位置 我有broccoli sass安装在我的插件项目中 当我将文件夹包含在中时 我的虚拟测试网站可以正确编
  • 避免硬编码 SQL 语句的最佳策略是什么

    有一天 我向一位同事展示了我正在编写的一些代码 他顺便评论了我对 SQL 语句进行了硬编码这一事实 现在 这些 SQL 语句是极其静态的 而那些确实会发生变化的 SQL 语句我将其放入数据库视图中 并具有硬编码的 从视图中选择列 之类的事务
  • 如何在ansible中配置azure模块

    正如主题中提到的 我想在ansible中配置azure模块 也在github中找到azure模块 但我不知道如何设置 请帮助我安装和配置 你需要安装sudo pip install azure 0 11 1 最新的 azure 版本 gt
  • Font Awesome 图标未显示在我使用 Bootstrap4 制作的网页上

    我正在做一个使用 Bootstrap 4 CDN 的网页我打算用FontAwesome 图标用于我的社交媒体链接 但是打开页面时我看到一些蓝色盒子而不是图标和它们是实用的 我只需要显示图标 任何帮助 将不胜感激 以下是必要的片段 1
  • 如何将 IO::Scalar 与 Image::Magick::Read() 一起使用?

    我有一张经过处理的图像GD 图像我想做进一步的操作图片 魔法 我想避免将图像写入磁盘 以便 Image Magick 可以将其读入 Image Magick 的 Read 函数将接受文件句柄作为参数 因此我尝试向其传递 IO Scalar我
  • az acr - 如果单个帐户有多个订阅,则无法找到存储库

    我在用着Azure CLI v2 0 62 我在 Azure 中的单个帐户上确实有多个订阅 S1 S2 S3 S4 我正在执行以下脚本以将动态值插入存储库 az login az acr build ParentStorage platfo
  • 根据 C# 中创建的日期搜索文件

    我有一个函数 用于读取目录并获取具有特定搜索模式的文件 有没有办法使用基于创建日期或修改日期的搜索模式 public static List
  • Android 中的地理围栏触发问题

    我正在使用 Android 设备的本机地理围栏服务 以下是实施细节 跟踪转换类型 ENTER 范围 500 米 1640 英尺 通知响应时间 500ms 添加地理围栏数量 15 20 初始触发 setInitialTrigger 未设置 设
  • 在 g-recaptcha-response 中获取 Null Google 的 reCaptcha

    我正在尝试实现 Google 的 reCaptcha v 2 0 但我在中得到 nullg recaptcha 响应由于此 reCaptcha 无法正常工作 我总是收到以下错误请单击 reCAPTCHA 框 即使我成功提交了验证码 我var
  • gnuplot 指定标签列

    我正在 gnuplot 中做一个多重绘图 我想从某些列中选择点的标签 例如 假设数据文件是 year temp label1 year humidity label2 1990 30 hot 1991 100 wet 1992 25 war
  • PHP 缓存的最佳方式

    目前 我正在尝试编写一个关于电子商务的软件 我的数据通常只是 MySQL 查询 例如语言变量结果 错误号猫 gt No category found 在 PHP 中缓存这些数据的最佳且简单的方法是什么 apc
  • 将字符串列表转换为列表列表,列表列表中的每个元素作为字符串中的每个可迭代字母。全部排成一行

    使用字符串 x 列表 x foo bar 我怎样才能在一行中完成以下操作 y for word in x y append n for n in word print y 导致 f o o b a r With list和简单的列表理解 g
  • 在回调函数中访问 $(this)

    我正在努力将prompt 更改为jPrompt 因为IE阻止prompt 运行 问题是 this 不再正常工作 因为 jPrompt 不返回值 而是使用回调函数 假设我有这样的东西 它有效 a foo click function this
  • Jupyter 笔记本并排显示两个 pandas 表

    我有两个 pandas 数据框 我想在 Jupyter 笔记本中显示它们 做类似的事情 display df1 display df2 将它们显示在另一个下面 我想在第一个数据框的右侧有第二个数据框 有类似的问题 但看起来人们对将它们合并到
  • 使用 JQuery 更改 CSS 属性

    今天我看到了一个非常简单的方法来改变font size使用 jQuery 的元素 它看起来与以下内容非常相似 这显然不起作用 但我想知道缺少什么 我记得这只是一行代码 注 我已经尝试过jQuery document body css fon
  • 我可以使用 ObjectChangeListener 监听任何对象的更改吗?

    我有一个Integer称为x 如果它发生变化 那么我想在 GUI 中更新我的表 听 x 我已经尝试过 ChangeEvent y new javax swing event ChangeEvent x 我实施javax naming eve
  • Netlogo 数组需要文字值

    该数组需要一个文字值 set chrom forage min forage rate share min share rate mating treshold print chrom 我该如何处理 我真的不明白 Netlogo 中的数组
  • DDD 和聚合事务边界

    假设我有一个名为文档的对象 它有一堆图像 音频 视频等形式的子对象 因此 我的应用程序的用户可以通过键入一些文本 添加图像 视频等来创建文档 据我了解在DDD中 文档是一个聚合体 而图像 视频总是与作为根的文档相关联 基于这种理解 我将如何
  • 处理 html 表单提交中的 UTF 字符

    我的 html 表单有一些输入文本字段 这些字段可能会获取中文 日文 欧洲字符 特殊字符 例如 等 简而言之 就是 unicode 字符 为了在服务器端 使用 php 处理这些值 我可以假设所有浏览器在提交表单时默认都以 UTF 8 格式对
  • 使用 Perl 正则表达式确定 URI 是否有效

    对于我正在开发的应用程序 我需要一个 Perl 脚本 它循环遍历大量 CSV 文件并确保每一行都包含有效的 URI 我之前已经问过一个关于解析 CSV 文件的问题 并且我已经开始使用Text CSV让我的生活变得更轻松 现在我面临确保 UR