我希望有人已经写了这个:
可以使用正则表达式搜索/替换模式配置的servlet过滤器,并将其应用于HTML输出。
这样的事情存在吗?
我找不到一个,所以写了一个:
RegexFilter.java
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
/**
* Applies search and replace patterns. To initialize this filter, the
* param-names should be "search1", "replace1", "search2", "replace2", etc.
*/
public final class RegexFilter implements Filter {
private List<Pattern> searchPatterns;
private List<String> replaceStrings;
/**
* Finds the search and replace strings in the configuration file. Looks for
* matching searchX and replaceX parameters.
*/
public void init(FilterConfig filterConfig) {
Map<String, String> patternMap = new HashMap<String, String>();
// Walk through the parameters to find those whose names start with
// search
Enumeration<String> names = (Enumeration<String>) filterConfig.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
if (name.startsWith("search")) {
patternMap.put(name.substring(6), filterConfig.getInitParameter(name));
}
}
this.searchPatterns = new ArrayList<Pattern>(patternMap.size());
this.replaceStrings = new ArrayList<String>(patternMap.size());
// Walk through the parameters again to find the matching replace params
names = (Enumeration<String>) filterConfig.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
if (name.startsWith("replace")) {
String searchString = patternMap.get(name.substring(7));
if (searchString != null) {
this.searchPatterns.add(Pattern.compile(searchString));
this.replaceStrings.add(filterConfig.getInitParameter(name));
}
}
}
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// Wrap the response in a wrapper so we can get at the text after calling the next filter
PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, wrapper);
// Extract the text from the completed servlet and apply the regexes
String modifiedHtml = wrapper.toString();
for (int i = 0; i < this.searchPatterns.size(); i++) {
modifiedHtml = this.searchPatterns.get(i).matcher(modifiedHtml).replaceAll(this.replaceStrings.get(i));
}
// Write our modified text to the real response
response.setContentLength(modifiedHtml.getBytes().length);
out.write(modifiedHtml);
out.close();
}
public void destroy() {
this.searchPatterns = null;
this.replaceStrings = null;
}
}
CharResponseWrapper.java
package com.example;
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* Wraps the response object to capture the text written to it.
*/
public class CharResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
public CharResponseWrapper(HttpServletResponse response) {
super(response);
this.output = new CharArrayWriter();
}
public String toString() {
return output.toString();
}
public PrintWriter getWriter() {
return new PrintWriter(output);
}
}
示例web.xml
<web-app>
<filter>
<filter-name>RegexFilter</filter-name>
<filter-class>com.example.RegexFilter</filter-class>
<init-param><param-name>search1</param-name><param-value><![CDATA[(<\s*a\s[^>]*)(?<=\s)target\s*=\s*(?:'_parent'|"_parent"|_parent|'_top'|"_top"|_top)]]></param-value></init-param>
<init-param><param-name>replace1</param-name><param-value>$1</param-value></init-param>
</filter>
<filter-mapping>
<filter-name>RegexFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
问题内容: 我在为ElasticSearch Regexp Filter正确表达正则表达式时遇到问题。我正在尝试匹配url字段中“ info-for / media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press- release-1 。为了尝试正确使用我现在使用的正则表达式,但这最终将与用户的查询字符串一起使用。 POST到localhos
问题内容: 我正在http://www.debuggex.com上构建正则表达式帮助器。我想显示的细节量要求我编写自己的解析器和匹配器。 为了确保解析器和匹配器正常工作,我针对正则表达式的Javascript编写了自己的单元测试,但是这些仅涵盖了我所知道的边缘情况。我想使用一个标准的测试套件,最近指向我将要使用的http://hg.ecmascript.org/tests/test262/summ
问题内容: 我想在Java中构建一个正则表达式,该正则表达式将在FilenameFilter中传递以过滤目录中的文件。 问题是我无法理解正则表达式“思维模型”的问题:) 这是我用来选择要排除的文件的正则表达式 (((ABC | XYZ))+ \ w * Test.xml 我想做的是选择所有以Test.xml结尾但不以ABC或XYZ开头的文件。 您能否添加任何可以帮助我应对正则表达式的资源。 谢谢
我不知道这是因为android-studio做错了什么,还是intelliJ中所有gradle项目都做错了什么,但有时当我运行Build/Debug时,我得到的只是: 我似乎找不到任何方法来获得更多信息,因为这段文字已经出现在我认为是编译器输出的内容上。 我该看哪?
我在我的react.js应用程序中安装了Firebase,安装了FirebaseUI,并让Google sign-in正常工作。但是,Google signin按钮上绝对没有应用css样式表。我在https://firebase.google.com/docs/auth/web/firebaseui这里看了文档,并访问了firebaseui.css文件的cdn链接https://cdn . fir
我在Java的一次采访中被问到这个问题。我不能解决它,但我猜它可以解决使用正则表达式。不确定是否有一种不使用正则表达式的替代方法。有人能帮我用正则表达式吗?或者,如果不使用正则表达式就能解决这个问题。 给定一个平衡括号字符串(它只包含或,并且它已经平衡),我需要查找它内部是否包含模式(表示一个或多个平衡括号表达式)。也就是说,检查它是否在任何中包含3个或更多的。 示例: 对于,预期答案为true,