url 上的正则表达式无法在没有 GET 参数的情况下拆分散列

Posted

技术标签:

【中文标题】url 上的正则表达式无法在没有 GET 参数的情况下拆分散列【英文标题】:regex on url cannot split out hash without GET param 【发布时间】:2015-12-04 17:04:08 【问题描述】:

我几乎已经实现了我的目标:一个检查有效 url 然后返回其部分的函数。一个有效的 url 很可能是无模式或无协议的(这用于前端侦听 textarea 和后端解析来自抓取的 url 及其标签的结果)。

以下是工作示例: http://jsfiddle.net/6v1u5w1f/2/

var url = 
check:function( url )
	var urlPattern = /((http|ftp|https):)?\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/gi;
	var patt = new RegExp( urlPattern );
	return patt.exec( url );
,
getParts: function( url )
	url = this.check( url );
    if( !url ) return false;
 			var singleUrlPattern =/^(?:(.*?):)?(\/\/)?(?:[^\/\.]+\.)*?([^\/\.]+)\.?([^\/]*)(?:([^?]*)?(?:\?([^#]*))?)?(.*)?/;
   			return singleUrlPattern.exec( url[0] );
   	
;


var urls = 
 schema_less:	'//cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
 http: 			'http://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
 https: 		'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
 get: 			'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg?this=that',
 hash: 			'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg#this=that',
 getAndHash:		'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg?this=that#dogs=cats',
 none: 			'cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
 sentence:		'bob https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg dog',
 barUrl:			'hi there this is my url: mazonaws.com/img/636/nl_nbp.jpg' ;

//loop each url and run through the getParts function and print what it returns
for( var keya in urls )
  console.log( keya+':' );
  console.log( url.getParts( urls[keya] ) );
  console.log( '               ' );    

在示例中,它将遍历一系列 poss url 模式并在控制台记录函数的结果。

问题仅在于 url 中的散列,我无法将散列从 url 的路径中分离出来。当有一个 GET 参数时,它被找到但不仅仅是一个哈希..

【问题讨论】:

【参考方案1】:

考虑到您已经尝试过的内容以及问题的范围,您可以使用以下表达式来匹配网址:

(?:(https?|ftp):\/\/)?\/*([^:\/\s]+)((\/\w+)*\/)([-.\w]+[^#?\s]*)?(?:\?([^#\s]*))?(#[-\w@?^=%&;\/~+#]+)?

Test online and read the explanation pane on the right

免责声明:这个正则表达式确实有一些误报,匹配任何带有“/”的东西,因为 URI 与文本中的任何单词都没有太大的不同。此外,它并未涵盖所有有效的 URI。它只是作为 OP 声明的一种方法。

但是,如果您尝试解析 URL,则 regex 不是解决此问题的工具。浏览器已经这样做了。检查以下代码:

var urls = 
  schema_less:	'//cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
  http: 		'http://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
  https: 		'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
  get: 			'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg?this=that',
  hash: 		'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg#this=that',
  getAndHash:	'https://cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg?this=that#dogs=cats',
  none: 		'cartassets.s3.amazonaws.com/img/636/nl_nbp.jpg',
;

var parseURL = document.createElement('a');

for( var keya in urls )
  parseURL.href = urls[keya];
  ['href','protocol','host','hostname','port','pathname','search','hash'].forEach( function(part) 
    document.write("<br />", keya , ": ", part, ": ", parseURL[part]);
  );

【讨论】:

以上是关于url 上的正则表达式无法在没有 GET 参数的情况下拆分散列的主要内容,如果未能解决你的问题,请参考以下文章

Qt笔记-使用正则表达式匹配URL及获取Get请求后面的参数(QRegExp)

django url路由参数错误

当 URL 不是根时,无法使用 Laravel 获取 URL 上的 GET 参数

java怎么获取url上的参数

有没有开源方法能直接获取url的参数值

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性