2011-10-21 3 views
0

스피 preg_replace이다를 사용하여 내 html로 sidewide에 앰퍼샌드를 교체하려고하지만, 문제는이 인라인을 파괴한다는 것입니다 자바 스크립트 & & 또는 자바 스크립트 URL을 같은? 페이지 = 시험 & 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 (자바 스크립트의 경우) 또는 HTML 엔터티를 따르는 경우 대체하지 마십시오.

하지만 여기에서는 다소 불필요한 논리를 발견했습니다. 또한 같은 테스트 인 경우 & 테스트 인 경우 앰퍼샌드를 대체하지 않습니다.

iam이 정규 표현식 전문가가 아니기 때문에 이것은 꽤 오래되었습니다. 그래서 나는 여기서 다시 도움을 요청할 것이라고 생각했습니다.

javascript 스크립트 태그가 아닌 경우 모든 앰퍼샌드를 바꾸는 것이 좋지 않습니까? 나는 allready 그러나 진짜 성공을 시도했다

아무도 내가 그것을 보관할 수있는 방법을 알고 있습니까? 감사합니다 같은 간단하지 뭔가 이유

+0

어떻게 이러한'및'처음에 거기에 도착 않았다 샘플 작업을? 오히려 그 문제를 고쳐야하지 않습니까? –

+0

사용자가 제출 한 콘텐츠. 앰퍼샌드 출력을 수정하기 위해 각 PHP 파일을 작성하여 문제를 해결할 수 있음을 알고 있습니다. 하지만이 특별한 경우에는 그럴 필요가 없습니다. 내 pp 코딩이 충분히 커지면이 문제에 대한 하나의 글로벌 선언문을 원합니다. 내 HTML을 모두 살펴보고 스크립트 태그 내에서 바꿀 수 없다면 – Basti

답변

0

: 당신이 자바 스크립트 안에 모든 앰퍼샌드를 교체하는 일이 없도록하려면

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

스크립트 태그에 속성이있는 경우 약간 수정해야합니다.

사용자 콘텐츠를 살균하는 경우 이미 사용 가능한 도구를 사용하는 것이 좋습니다. (: 속성 값 예)
을하고, 아래 대부분의 차례 나오는 작동합니다 같은 것을 스크립트 블록을 피하기 그냥 내용에 '&을'변환 및 태그를 피하려면 HTML Purifier

+0

$ skin var은 내 구문 분석 된 HTML이므로 내 구멍 HTML을 통해 보면 내 경우에는 불행하게도 작동하지 않습니다. 내 위의 작품으로하지만 난 그것을 간단하게 원한다면, 모든 스크립트 태그 안에 & 대체하지 싶습니다. 나는 단순히 각각의 함수에서 대체를 할 수 있지만, 오히려 한 번만이 코드를 작성합니다. – Basti

+0

또한 스크립트 태그를 사용해 보았습니다. 그러나 오류가 있거나 올바르게 입력하지 않은 것처럼 보입니다. – Basti

+0

시도 할 것입니다. 분할 메서드, 감사합니다 :) – Basti

1

를 참조하십시오.
그러나 속성 값도 변환해야합니다.
이렇게하려면 더 많은 작업이 필요합니다.

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;'; 
} 

?>