0

我写了一个相当庞大的正则表达式以在coffee-script项目中使用。它旨在获取大量用户文本(消息、帖子、散文)并在其中找到所有潜在的 URL,尽可能贪婪。

urlGrabber = ///
  (\s|^)                              # Start after a whitespace or string[0]
  ([a-zA-Z]+\://)?                    # Captures any protocol (just not //)
  (\w+:\w+@)?                         # Username:Password
  ([a-zA-Z\d-]|[a-zA-Z\d-]\.)*        # Subdomains
  [a-zA-Z\d-]{2,}                     # Domain name
  \.                                  # THE DOT
  ([a-zA-Z]{2,4}(:\d+)?)              # Domain Extension with Port
  ([/\?\#][\S/]*)*                    # Some Request, greedy capture
  \b                                  # Last word boundary
  /?                                  # Optional trailing Slash
///g

我遇到了字符串问题,例如abc.mno.st.u.xvywhereabs.mno.st被解析为字符串。这根本不应该被捕获。被捕获的as.ds.d.地方也是如此。as.ds

谁能解释为什么会发生这种情况和/或帮助解决该问题所需的更改?

4

1 回答 1

1

使用正则表达式模式

(?:\s+|^)                                                   # leading spaces
([a-zA-Z]+://|)                                             # protocol
(\w+:\w+@|)                                                 # username:password@
((?:[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*\.)*)                       # subdomain(s)
([a-zA-Z\d]+(?:[a-zA-Z\d]|-(?=[a-zA-Z\d]))*[a-zA-Z\d])      # domain
(\.[a-zA-Z]{2,4})                                           # .top-level-domain
(:\d+|)                                                     # :port
(/\S*|)                                                     # rest of url
(?!\S)

注意:子域和域不能以开头和结尾,-也不应该有双精度--(除非您想支持Punnycode for IDN 域名)。

于 2012-11-15T21:35:21.853 回答