无法正确获得Java RegEx

时间:2013-11-12 10:06:50

标签: java regex

我在尝试正常表达时遇到问题。基本上,我有一个包含各种链接的HTML字符串。如果href属性指向同一域或已批准域列表中的域,则不会更改任何内容。应将其他任何内容更改为重定向页面,并将原始href作为URL参数

例如,假设允许以下域名:

domain1, domain2, domain3

和不允许的域指向“/redirect.htm?url = ...”

我想要以下字符串

<p>this is a paragraph with 
    <a href="/index.htm">link 1</a> and 
    <a href="http://domain4/page.htm">link 2</a> and 
    <a href="http://www.domain1.com">link3</a> and 
    <a href="http://www.domain5.com/directory/page.htm">link 4</a>
</p>

更改为:

<p>this is a paragraph with 
    <a href="/index.htm">link 1</a> and 
    <a href="/redirect.htm?url=domain4/page.htm">link 2</a> and 
    <a href="http://www.domain1.com">link3</a> and 
    <a href="/redirect.htm?url=www.domain5.com/directory/page.htm">link 4</a>
</p>

我还应该指出,我正在使用IdocScript,这是一种基于Java的自定义语言,适用于我们的内容管理系统。我不需要帮助,只需要正则表达式。

到目前为止,我提出的最好(显然不起作用)是:

<$ regex = "href=\"(^(/|domain1|domain2|domain3)" $>
<$ regexReplaceAll( originalString, regex, 'href="/redirect.htm?url=$1') $>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

s/href="(?!=(\/|.*(domain1|domain2|domain3)))/href="\/redirect.htm?url=/

如果我们有一个href,并且它不是以斜杠开头且它不包含domain1,domain2或domain3,请插入重定向。

如果需要,您可以收紧并查找特定的子域名:

s/href="(?!=(\/|http://((www|mobile|mysubdomain)\.)?(domain1|domain2|domain3)))/href="\/redirect.htm?url=/

取一个href="后面没有[斜杠]或[可选子域名和其中一个列出的域名],将其替换为相同的href=" + /redirect.htm?url=。< / p>

我已经逃脱了斜线,但在您选择的正则表达方言中可能没有必要。

答案 1 :(得分:0)

这个应该符合您的需求:

href="https?://((?:[^"](?<!\b(?:domain1|domain2|domain4)\b))+)"

Regular expression visualization

替换为:

href="/redirect.htm?url=$1"