2011-10-21 92 views
0

荫试图替换&符号使用的preg_replace我的HTML sidewide,但问题是,它打破联JavaScript & &或JavaScript网址样?页=测试& ID = 1PHP的preg_replace正则表达式前瞻

现在我有这个代码,它的工作原理

$amp_replace = array(); 
$amp_replace[0] = '/(?<=\s)&(?!&)(?!#?[a-z0-9]+;)/'; 
$amp_replace[1] = '/(?<!&)&(?=\s)/'; 
$skin = preg_replace($amp_replace, '&amp;', $skin); 

当左侧或右侧空间替换时,替换&符号。不要在连续2个符号(对于javascript)或者通过html实体跟随时进行替换。

但我在这里找到了一些不需要的逻辑。它也不会取代&符号,如果它的测试&测试。

由于我没有正则表达式的专家,这让我有一段时间了,所以我想我再次寻求帮助。

如果不在JavaScript脚本标记中,简单地替换所有&符号会更好吗?我试过,但已经没有真正的成功

有谁知道我该如何归档? 谢谢

+0

怎么这些'&'那里摆在首位?你不应该解决这个问题吗? –

+0

用户提交的内容。我知道我可以通过写入每个php文件来修复它,以修复&符输出。但在这种特殊情况下,我不需要那样。由于我的pp编码变得足够大,我宁愿为此拥有一个全局声明。查看我所有的html,如果不在脚本标记中,则替换 – Basti

回答

0

为什么不喜欢简单的东西:

$html = preg_replace('/([^&])&([^&])/', '$1&amp;$2', $html);

如果你想避免更换Javascript中所有的&符号,加超前/落后于script标签,或先在script标签拆分文档,并且只对非脚本部分运行替换。

$html = preg_split('/<\/?script>/', $html); 
foreach ($html as $k => $v) { 
    if ($piece[0] == "<") { 
    $html[$k] = preg_replace('/([^&])&([^&])/', '$1&amp;$2', $v); 
    } else { 
    $html[$k] = "<script>" . $html[$k] . "</script>"; 
} 

如果您的脚本标记具有属性,这将需要一些修改。

如果您正在清理用户内容,那么使用已经可用的工具可能会更好。见HTML Purifier

+0

$ skin var是我的解析html,所以我通过我的洞html来查看,这在我的情况下不起作用。因为我上面的作品,但我希望它simpliere,就像替换所有&如果不在脚本标记。我知道我可以简单地在我的每个功能中进行替换,但我宁愿只写一次 – Basti

+0

也尝试过使用脚本标记,但它看起来像我从来没有得到它的权利,无论是错误还是它不替换 – Basti

+0

将尝试分裂的方法,谢谢:) – Basti

1

如果你只是想在内容转换“&”,避免标签(即:属性值)
,避免脚本块,像下面将大部分occurances工作。
但是,应该注意的是,属性值也应该被转换。
这样做需要更多的工作。

工作样本http://www.ideone.com/9MhCq

<?php 

$html=<<<EOD 
<some &ta&g> S&P &&more; and &some; <more> &notme; 
    && &#209; &#xa92F; 
<script flavor?> 
    val && this & this 
</script> 
& 
EOD; 

$rxent = '(?:&(?:[A-Za-z_:][\w:.-]*|\#(?:[0-9]+|x[0-9a-fA-F]+));)'; 

$rxtag = 
'< 
(?: 
    \?php\s+.*?\? 
    | (?: 
     (?: 
      (?:script|style)\s* 
     | (?:script|style)\s+(?:".*?"|\'.*?\'|[^>]*?)+\s* 
     )> .*? </(?:script|style)\s* 
    ) 
    | (?: 
     /?[A-Za-z_:][\w:.-]*\s*/? 
     | [A-Za-z_:][\w:.-]*\s+(?:".*?"|\'.*?\'|[^>]*?)+\s*/? 
     | !(?:DOCTYPE.*?|--.*?--) 
    ) 
) 
> 
'; 

$rxmain = "~(?xs:((?:$rxtag)+) | ((?!$rxent)&))~"; 


print "$html\n\n"; 

$html = preg_replace_callback($rxmain, 'fixamp_cb', $html); 

print "$html\n"; 

function fixamp_cb($matches) { 
    # Return tags and script blocks unchanged. 
    if (isset($matches[1]) && $matches[1]) 
     return $matches[1]; 
    return '&amp;'; 
} 

?>