首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不要考虑字符串中的短语

不要考虑字符串中的短语
EN

Stack Overflow用户
提问于 2013-12-14 03:10:24
回答 2查看 134关注 0票数 1

背景如下:

  • 我正在将URL (不管有没有协议和www)转换成可点击的链接。
  • 我用httphttpsftpfilewwwhttp/httpswww的一些组合来实现URL的正则表达式。
  • 我还让regex为URL工作,只有www而没有协议。

但是,我无法找到一个用于查找没有协议和没有服务器名称(www)的URL的工作机制。

我在(http://gskinner.com/RegExr/)中尝试了以下内容

代码语言:javascript
复制
 ([^www\.|http\:// ][a-zA-Z0-9\.]+)((?:[a-zA-Z0-9]+\.)+)([a-zA-Z]{2,4})([\/a-zA-Z0-9]+)([\?][a-zA-Z0-9]+)?

但这似乎只适用于该网站,而不适用于我的申请。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2013-12-16 03:40:14

好吧,你可能不会太喜欢这个答案--但也许你会喜欢?我有一个正则表达式(改编自),它似乎能在文本中找到URL。您可以看到一个演示关于regex101.com

实际表达式非常长--这是因为它包含“所有合法的TLD (顶级域)”,这是查找“好”URL的良好开端。

代码语言:javascript
复制
((?:(?:http|ftp|https):\/{2}){0,1}(?:(?:[0-9a-z_-]+\.)+(?:aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mn|mn|mo|mp|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|nom|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ra|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw|arpa)(?::[0-9]+)?(?:(?:\/(?:[~0-9a-zA-Z\#\+\%@\.\/_-]+))?(?:\?[0-9a-zA-Z\+\%@\/&\[\];=_-]+)?)?))

正如您所看到的,这个表达式的绝大多数都是使用的,确保TLD是众多合法的(270种备选方案之一)之一。我不知道有这么多,直到我偶然发现http://mathiasbynens.be/demo/url-regex,在那里我发现了这个表达的种子)。

我对我在上面的链接中找到的表达式所做的修改--大多数情况下,我只是让所有的组(除了外部的组)都没有捕获,所以只有一个“匹配”。在我发布的示例中,我展示了捕获中将包含一个“好”协议定义(如http://),而“坏”协议定义(如http:/)将被忽略-然而,下面的URL仍将被捕获。我还显示,在表达式后面添加标点符号(用;!测试)并不会分阶段进行:它捕获的是“直到那个点”,而不是超出这个阶段。

玩它,看看你喜欢它。对于“病态”URL,它相对比较差(根据上面的链接),也不适用于阿拉伯语等等--但基于您的问题,我不认为这将是一个问题。

简短的解释:

代码语言:javascript
复制
(?:(?:http|ftp|https):\/{2}){0,1}  

  (?:http|ftp|https)  - match one of http, ftp, or https - non capturing "OR" group
  :\/{2}              - followed by a colon and exactly two forward slashes
  (?: …){0,1}         - the whole thing zero or one times (so no protocol, or properly formed)

(?:(?:[0-9a-z_-]+\.)+ 
   [0-9a-z_-]+\.      - at least one of the characters in the given range, followed by a period
(?:  )+               - the whole thing one or more times, non-capturing

(?:aero|asia …)       - one of these strings, non-capturing (these are all the valid TLDs)
(?::[0-9]+)?          - zero or one times a colon followed by one or more digits: port specification
                      - this makes sure that www.something.us:8080 is valid

后面的所有内容都匹配所有可以跟踪的不同内容-目录、查询等。

票数 2
EN

Stack Overflow用户

发布于 2013-12-17 02:01:47

@Floris --你的建议效果很好。我编辑了它一点点,并利用添加了一个@来检测电子邮件。我还编辑了一个更简单的工作流(没有TLD) -

代码语言:javascript
复制
((?:(?:http|ftp|https):\/{2}){0,1}(?:(?:[0-9a-z_@-]+\.)+(?:[0-9a-zA-Z]){2,4})(?::[0-9]+)?(?:(?:\/(?:[~0-9a-zA-Z\#\+\%\@\.\/_-]+))?(?:\?[0-9a-zA-Z\+\%@\/&\[\];=_-]+)?)?)

谢谢你的帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20579267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档