【问题标题】:JS regex not working on iPhone browser specifically - not sure whyJS 正则表达式不适用于 iPhone 浏览器 - 不知道为什么
【发布时间】:2022-11-12 19:12:52
【问题描述】:

我最近对代码进行了一些更改,并意识到更新的页面之一在 iPhone 浏览器上不起作用。果然,它没有,但在我测试的所有其他浏览器中都有效。

任何人都可以看到或提供一些见解,说明为什么这行特定的代码在 iphone 浏览器上会失败,但在其他地方有效吗? iPhone 不喜欢正则表达式,我需要使其兼容。请注意,此行上的浏览器错误并不是正则表达式本身失败(如果这有意义的话)。

我不知道如何在 iPhone 浏览器上查看调试信息以查看是否提供了任何信息。我确实知道,如果我从页面下方删除正则表达式模式,该页面将在 iPhone 上再次运行,这告诉我这就是问题所在。

return this.optional(element) || /^(\*\.|((?!-)[a-z0-9-]{1,255}(?<!-)\.))((?!-)[a-z0-9-]{1,255}(?<!-)\.)*[a-z]{2,}$/i.test(value);

【问题讨论】:

  • There is something about the regex that iPhone does not like - 这是正则表达式向后看Safari 无法理解 - caniuse.com/js-regexp-lookbehind
  • @Jaromanda X - 有什么办法解决这个问题或改变正则表达式来完成同样的事情吗?
  • 可能,但我不是正则表达式专家 - 事实上,如果可以的话,我会避免使用正则表达式 - 查看你发布的代码,我不知道正则表达式试图测试什么......所以,我无法提供任何替代方案- 我简单地回答了你的问题 -任何人都可以看到一些东西或提供一些见解为什么这行特定的代码会在 iphone 浏览器上失败- 由于您似乎对正则表达式足够了解以创建那段代码,那么您肯定可以找到一种解决方法(lookbehinds 最多只能在其他浏览器中工作 3 年)

标签: javascript ios regex


【解决方案1】:

iOS 上的 Safari 不支持后视(在撰写本文时)。您的正则表达式在这里使用lookbehind:(?&lt;!-)

您可以通过替换此部分来避免向后看:

[a-z0-9-]{1,255}(?<!-)

有了这个:

[a-z0-9-]{0,254}[a-z0-9]

【讨论】:

    【解决方案2】:

    如果您不想匹配双连字符,则可以使用单个否定前瞻断言而不是字符串中的 -- 来编写模式:

    ^(?!.*--)(?:*|[a-z0-9-]{1,255}).[a-z0-9-]{1,255}.[a-z]{2,}$
    

    解释

    • ^字符串开始
    • (?!.*--)负前瞻,断言不是--在右边
    • (?:非捕获组
      • *匹配*
      • | 或 或
      • [a-z0-9-]{1,255} 匹配 1-255 个字符 a-z 0-9 -
    • )关闭非捕获组
    • .[a-z0-9-]{1,255} 匹配 . 和 1-255 个字符 a-z 0-9 -
    • .[a-z]{2,} 匹配 2 个或更多字符 a-z
    • $ 字符串结束

    Regex demo

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2014-01-03
      • 2017-10-20
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多