描述
该表达式将:
- 允许您仅替换
hello world
锚标记之外的子字符串
- 避免困难的边缘情况,这使得 HTML 中的模式匹配变得困难
- 不使用原子组,因为它们在 Javascript 中是不允许的
正则表达式
((?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>|(?!hello\sworld|<a\s).)*)(hello\sworld\s\d+)((?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>|(?!hello\sworld|<a\s).)*)
Full Explaination
理论:
((?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>|(?!hello\sworld|<a\s).)*)
捕获锚标记,以及锚标记之外的任何非hello world
. 这是第 1 组
(hello\sworld\s\d+)
捕捉你好世界。这是第 2 组。由于我在示例文本中添加了数字以帮助显示正在捕获的子字符串,因此我还在\s\d+
本节中添加了 。是的,可以说这超出了您的原始范围。:)
((?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>|(?!hello\sworld|<a\s).)*)
捕获锚标记,以及锚标记之外的任何非hello world
. 这是第 3 组。它与第 1 组的模式相同,但它是必需的,否则您可能会在字符串中的最后一个匹配项中遇到奇怪的结果。
用。。。来代替
在下面的示例中,我使用此替换来帮助更清楚地了解正在发生的事情:
$1_______$3
您可以使用它来hello world
用锚标记替换您的字符串:
$1<a href="$2">$2</a>$3
例子
示例文本
请注意带有 onmouseover 属性的锚标记中的困难边缘情况。我还在每个hello world
s 中添加了数字,以便我们人类更容易阅读。
<a href="#">hello world 00</a>Hello world 1! hello world 2! Hello world 3! <a onmouseover=' a=1; href="www.NotYourURL.com" ; if (3 <a && href="www.NotYourURL.com" && id="revSAR" && 6 > 3) { funRotate(href) ; } ; ' href="#">hello world 04</a><p>hello world 5</p><p><a href="#">hello world 06</a></p> <a href="#">hello world 07</a>fdafdsa
示例 Javascript
<script type="text/javascript">
var re = /((?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>|(?!hello\sworld|<a\s).)*)(hello\sworld\s\d+)((?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>|(?!hello\sworld|<a\s).)*)/;
var sourcestring = "source string to match with pattern";
var replacementpattern = "$1<a href="$2">$2</a>$3";
var result = sourcestring.replace(re, replacementpattern);
alert("result = " + result);
</script>
替换后的字符串
这只是为了显示正在发生的事情,使用第一个“替换为”
<a href="#">hello world 00</a>_______! _______! _______! <a href="#">hello world 04</a><p>_______</p><p><a href="#">hello world 06</a></p> <a href="#">hello world 07</a>fdafdsa
这是使用第二个“替换为”来展示它实际上是如何工作的
<a href="#">hello world 00</a><a href="Hello world 1">Hello world 1</a>! <a href="hello world 2">hello world 2</a>! <a href="Hello world 3">Hello world 3</a>! <a onmouseover=' a=1; href="www.NotYourURL.com" ; if (3 <a && href="www.NotYourURL.com" && id="revSAR" && 6 > 3) { funRotate(href) ; } ; ' href="#">hello world 04</a><p><a href="hello world 5">hello world 5</a></p><p><a href="#">hello world 06</a></p> <a href="#">hello world 07</a>fdafdsa