要求如下:
查找范围:html的纯文字中,不包括“标签文字”,
查找并替换的目标字符串:例如下例中我要查找并替换 p 字符和 123 字符串,分别替换成<span class="高亮显示的文字">p</span>,<span class="高亮显示的文字">123</span>
例子:
作为查找大范围的html:
- HTML code
<img src="文件名中包含p字符.gif" alt="" /> <p>纯文字中包含p字符 <img src="文件名中包含p字符.gif" alt="" /> </p> 纯文字中包含123字符串 <img src="文件名中包含123字符串.gif" alt="" />
查找时,就只能在 纯文字中包含p字符 和 纯文字中包含123字符串 这两个字符串中查找并替换目标字符串。
<p> 这个字符串代表着一个标签,因此,虽然它包含有要查找的 p 字符,但查找时忽略它。
还有img标签中的src值为文件名中包含p字符.gif,虽然也包含有要查找的 p 字符,但查找时也忽略它,因为目标字符仍然处在“标签”中。
求高手给出 正则表达式 的写法.
我写了下边的正则表达式:
- VB code
((?:<[^>]+>)*[^<>]*)(p|123)([^<>]*(?:<[^>]+>)*)
但是,我的这种写法是有问题的,得不到正确结果.
我的想法是:每个匹配由3个“组“ 构成,如下:
((?:<[^>]+>)*[^<>]*)
(p|123)
([^<>]*(?:<[^>]+>)*)
,其中第二个“组”就是我要找的p 字符和 123 字符串。
第一个组是“查找目标”之前的部分,第三个组是“查找目标”之后的部分。
找到每个匹配之后,仅仅替换第二个“组”,第一个“组”和第三个“组”保持不变。
vb替换语句:
- VB code
objRegExp.Replace(entire_string,"$1<span class='高亮显示的文字'>$2</span>$3")
这种写法:得到的第一个匹配是:img src="文件名中包含p字符.gif" alt="" /,也就是第一个img标签中的字符串,这显然不是我要得到的。
下面是vb代码:
- VB code
Set objRegExp = New Regexp '设置匹配对象objRegExp.IgnoreCase = True '忽略大小写objRegExp.Global = True '设置为全文搜索string_of_RegExp="((?:<[^>]+>)*[^<>]*)(p|123)([^<>]*(?:<[^>]+>)*)" '正则表达式objRegExp.Pattern=string_of_RegExp entire_string=objRegExp.Replace(entire_string,"$1<span class='高亮显示的文字'>$2</span>$3")'entire_string是html字符串
------解决方案--------------------------------------------------------
- VBScript code
Set objRegExp = New RegexpobjRegExp.IgnoreCase = TrueobjRegExp.Global = TrueobjRegExp.Pattern = "(p|123)(?![^<]*>)"entire_string = objRegExp.Replace(entire_string, "<span class='高亮显示的文字'>$1</span>")