2011-10-21 8 views
0

はIAMにpreg_replaceを使用して、私のhtml sidewideにアンパサンドを交換しようとしているが、問題はそれがインラインjavascriptの& &などのJavaScript URLを壊すということです?ページ=テスト& ID = 1のPHPに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コーディングが十分に大きくなるにつれて、私はむしろこれについて1つのグローバルなステートメントを持ちたいと思っています。私のすべてのHTMLを見て、スクリプトタグ内でない場合は置き換えてください – Basti

答えて

0

:あなたはJavascript内のすべてのアンパサンドを置換しないようにしたい場合は

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

、追加先読み/後ろのスクリプトタグのためには、あるいは最初のスクリプトタグに文書を分割し、非スクリプト部分でのみ置換を実行します。

$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>"; 
} 

スクリプトタグに属性がある場合は、これに変更が必要です。

ユーザーのコンテンツを消毒する場合は、既に入手可能なツールを使用する方がよい場合があります。以下のようなものがほとんどoccurancesのために働くだろう、
およびスクリプトブロックを避ける:あなたは単に「&」を変換したい場合はコンテンツHTML Purifier

+0

$ skin varは私の解析HTMLですので、私は私の穴HTMLを見て、これは私の場合unfortunatlyで動作しません。私の上記のように動作しますが、私はスクリプトタグの中にすべて&を入れ替えるのと同じように、簡単にします。私はそれぞれの機能を置き換えるだけでいいのですが、私はむしろこれを一度書きます。 – Basti

+0

また、スクリプトタグで試してみましたが、正しいとは言えません。どちらかのエラーか置き換えません。 – Basti

+0

分割メソッド、感謝:) – Basti

1

を参照してくださいとタグ(属性値IE)を避けます。
ただし、属性値も変換する必要があります。
これを行うには、もっと多くの作業が必要です。サンプル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;'; 
} 

?>