0

我在尝试使我的正则表达式正确时遇到问题。基本上,我有一个包含各种链接的 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') $>

任何人都可以帮忙吗?

4

2 回答 2

0

这应该适合您的需求:

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

正则表达式可视化

替换为:

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

于 2013-11-12T10:24:08.123 回答
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="不跟 [a slash] 或 [an optional subdomain and one of the listed domain] 的,用相同的href="+替换它/redirect.htm?url=

我已经避开了斜线,但这在您选择的正则表达式方言中可能不是必需的。

于 2013-11-12T10:14:42.410 回答