我需要编写一些javascript来从url中删除hostname:port部分,这意味着我只想提取路径部分.
即我想编写一个函数getPath(url),使getPath(" http:// host:8081/path/to/something ")返回"/ path/to/something"
可以使用正则表达式完成吗?
RFC 3986(http://www.ietf.org/rfc/rfc3986.txt)在附录B中说明
以下行是用于将格式正确的URI引用分解为其组件的正则表达式.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9
上面第二行中的数字只是为了提高可读性; 它们表示每个子表达的参考点(即每个配对括号).我们将子表达式匹配的值称为$.例如,将上面的表达式与之匹配
http://www.ics.uci.edu/pub/ietf/uri/#Related
导致以下子表达式匹配:
$1 = http: $2 = http $3 = //www.ics.uci.edu $4 = www.ics.uci.edu $5 = /pub/ietf/uri/ $6 =$7 = $8 = #Related $9 = Related
where
表示该组件不存在,如上例中的查询组件的情况.因此,我们可以确定五个组件的值
scheme = $2 authority = $4 path = $5 query = $7 fragment = $9
我知道正则表达式很有用,但在这种情况下它们并不是必需的.Location对象是DOM中所有链接的固有对象,并具有pathname属性.
因此,要访问某个随机URL的属性,您可能需要创建一个新的DOM元素,然后返回其路径名.
一个例子,它将始终完美地工作:
function getPath(url) { var a = document.createElement('a'); a.href = url; return a.pathname.substr(0,1) === '/' ? a.pathname : '/' + a.pathname; }
jQuery版本:(如果需要,使用正则表达式添加前导斜杠)
function getPath(url) { return $('').attr('href',url)[0].pathname.replace(/^[^\/]/,'/'); }
快速'n'脏:
^[^#]*?://.*?(/.*)$
主机名和端口(包括初始/)之后的所有内容都在第一组中捕获.