2010-04-09 78 views

回答

1

JSTL中不存在此功能。最近的是fn:replace(),但它不支持正则表达式。另一个functions提供了摆脱领先的部分,直到与域(使用fn:substringAfter()几次在///),但没有什么可以很容易地摆脱尾随部分。也许有一大堆fn:substringAfterc:set在一个循环中,但它会使代码笨拙,不能真正重用。

嗯,在正则表达式可以使用^[^/]+/+[^/]+|[^/]+$此:

url = url.replaceAll("^[^/]+/+[^/]+|[^/]+$", ""); 

你可以创建一个自定义EL函数正是这样做的:

${f:replaceAll(url, '^[^/]+/+[^/]+|[^/]+$', '')} 

要做到这一点,首先创建象类这个:

package com.example; 

public final class Functions { 
    private Functions() {} 

    public static String replaceAll(String string, String pattern, String replacement) { 
     return string.replaceAll(pattern, replacement); 
    } 
} 

并创建/WEB-INF/functions.tld像这样:

<?xml version="1.0" encoding="UTF-8" ?> 
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" 
    version="2.1"> 

    <display-name>Custom Functions</display-name>  
    <tlib-version>1.0</tlib-version> 
    <uri>http://example.com/functions</uri> 

    <function> 
     <name>matches</name> 
     <function-class>com.example.Functions</function-class> 
     <function-signature>java.lang.String replaceAll(java.lang.String, java.lang.String, java.lang.String)</function-signature> 
    </function> 
</taglib> 

,你可以导入为:

<%@taglib uri="http://example.com/functions" prefix="f" %> 
+0

会不会是更好的使用http://java.sun.com/javase/6/docs/api/java/net/URL .html和getProtocol(),getHost()等? – Bozho 2010-04-10 05:25:13

+0

@Bozho:这也是我看到的第一个,但它没有方法来返回所需的字符串。 'getPath()'接近,但你仍然需要对最后一部分进行子字符串/替换。另外,构建一个“URL”会更贵一些。所以我想,让我们用'String#replaceAll()'给出一个通用的例子,它可能有更多的用途。 – BalusC 2010-04-10 20:18:01