背景如下:
www)转换成可点击的链接。http、https、ftp、file、www和http/https与www的一些组合来实现URL的正则表达式。www而没有协议。但是,我无法找到一个用于查找没有协议和没有服务器名称(www)的URL的工作机制。
我在(http://gskinner.com/RegExr/)中尝试了以下内容
([^www\.|http\:// ][a-zA-Z0-9\.]+)((?:[a-zA-Z0-9]+\.)+)([a-zA-Z]{2,4})([\/a-zA-Z0-9]+)([\?][a-zA-Z0-9]+)?但这似乎只适用于该网站,而不适用于我的申请。任何帮助都是非常感谢的。
发布于 2013-12-16 03:40:14
好吧,你可能不会太喜欢这个答案--但也许你会喜欢?我有一个正则表达式(改编自),它似乎能在文本中找到URL。您可以看到一个演示关于regex101.com。
实际表达式非常长--这是因为它包含“所有合法的TLD (顶级域)”,这是查找“好”URL的良好开端。
((?:(?: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,它相对比较差(根据上面的链接),也不适用于阿拉伯语等等--但基于您的问题,我不认为这将是一个问题。
简短的解释:
(?:(?: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后面的所有内容都匹配所有可以跟踪的不同内容-目录、查询等。
发布于 2013-12-17 02:01:47
@Floris --你的建议效果很好。我编辑了它一点点,并利用添加了一个@来检测电子邮件。我还编辑了一个更简单的工作流(没有TLD) -
((?:(?: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\+\%@\/&\[\];=_-]+)?)?)谢谢你的帮助。
https://stackoverflow.com/questions/20579267
复制相似问题