忽略<script> -Tag,同时用链接替换关键字</script>

时间:2013-05-15 11:45:33

标签: php regex preg-replace

我想用链接替换文本中的关键字。所以我创建了这个preg_replace:

$include = preg_replace('/(?!(?:[^<]+>|[^>]+<\/(span)><\/(a|option|h3)>|[^>]+<\/(a|option|h3|h4|h5|textarea|input|script)>))\b('.$key->key_word.')\b/is', '<a href="/'.$lang.'/'.$key->key_area.'/'.$key->key_page.'.html" title="'.$key->key_title.'" class="keylink">\\4</a>',$include,$limit,$count);

现在存在这个正则表达式在JavaScript(...)中工作的问题。如何更改它以解决此问题?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

肥皂盒

我们可以制作一个正则表达式以匹配您的特定情况,但鉴于这是HTML解析,并且您的用例暗示可以存在任意数量的标记,您最好使用DOM或使用类似的产品HTML Agility (free)

然而

考虑以下PowerShell通用正则表达式的示例。在示例中,我正在遍历任何脚本标记之外的每个匹配文本。从这里,您可以将字符串替换应用于每个匹配的组。应该注意的是,如果在脚本中使用的字符串看起来像打开或关闭的<script>标记,则会中断。

(?:^|</script[^>]*>)(.*?)(?=<script\s|$)

enter image description here

实施例

$Regex = '(?:^|</script[^>]*>)(.*?)(?=<script\s|$)'
$String = 'i wanna match a string contains<script src=value> is > that; bla ; bla is < this</script> match "bla" '

Write-Host start with 
write-host $String
Write-Host
Write-Host found
$Matches = @()
([regex]"(?i)$Regex").matches($String) | foreach {
    write-host "value at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
    } # next match

产量

start with
i wanna match a string contains<script src=value> is > that; bla ; bla is < this</script> match "bla" 

found
value at 0 = 'i wanna match a string contains'
value at 89 = ' match "bla" '