【问题标题】:php regex to dissect a literal regex to determine whats being looked forphp 正则表达式剖析文字正则表达式以确定要查找的内容
【发布时间】:2019-07-19 02:11:35
【问题描述】:

这需要比我更好的头脑...如何提取文字正则表达式正在寻找的模式。

我的应用程序与一个 API 接口,该 API 为有关特定字段的用户输入的特定字符串提供验证正则表达式。国家邮政编码就是一个例子:

Canada, {"ValidationRegex" : "^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][\\s\\-]?\\d[ABCEGHJ-NPRSTV-Z]\\d$" }
United Kingdom, {"ValidationRegex": "((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})|GIR0AA" }

我正在尝试分析正则表达式模式,看看它是只有字母、只有数字还是混合的。然后根据针对各种字符串测试的验证格式,我想强制显示针对该特定输入字段向用户显示的键盘类型。键盘类型基于TEXT, TEL, NUMBER 以及基于验证要求的<input> 长度或范围限制。不幸的是,似乎没有提供任何其他信息可以让我准确确定键盘类型或字符串长度,或者尝试分解验证正则表达式。

这可能适用于数百种不同类型的验证正则表达式,因此我希望找到一种通用方法从每个验证正则表达式中提取必要信息,以确定字符串代码是数字还是需要字符...和长度范围。

【问题讨论】:

  • 所以绝对清楚:正在评估的文本是正则表达式规则本身,您想知道它是否(在其他选项中)只是数字,它的长度。第一判断好像有这么多可能的迭代......
  • @Martin - 你是对的。正则表达式正则表达式。我想出了一种方法,可以准确地获取通过 api 发送的大约 85% 的内容,但不幸的是,有一个很好的 15% 以上我不能使用替代方法,获取数据的唯一方法是分析正则表达式

标签: php regex validation


【解决方案1】:

虽然您可以通过制定自己的正则表达式规则来自动执行此操作,但存在太多错误余地,因此值得依赖。要考虑的一种方法是将所有验证字符串转储到 SQL 表中。然后,您可以按照为每个唯一的正则表达式模式分配一个 ID 的方式对它们进行排序。然后在第二个表中,您可以将这些 ID 中的每一个与 TEXT、TEL、NUMBER 等类匹配。

所以你的表格看起来像这样:

tblRegexStrings
id | uniqueID | location         | regex
1    1          'Canada'           "^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][\\s\\-]?\\d[ABCEGHJ-NPRSTV-Z]\\d$"
2    2          'United Kingdom'   "((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})|GIR0AA"
3    2          'France'           "((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})|GIR0AA"

tblRegexClasses
uniqueID | classType
1          'TEXT'
2          'TEL'

如果在正则表达式模式中有大量重用(我怀疑会有),那么这将有助于将其减少到可以手动分配的合理数量的类。因此,如果 50 个位置使用与英国相同的正则表达式模式,您可以通过更改 tblRegexClasses 中第 2 行的 classType 来一次设置所有它们的类。

如果仍然需要对它进行正则表达式的数据太多,但也有很多重用,那么我仍然建议使用它,因为您仍然需要跟踪数据。由于您的正则表达式函数可能会做出错误的假设,因此您不需要为每个边缘情况都制造大量异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多