PHP 문자열을 JavaScript 변수에 전달하고 줄 바꿈을 피하십시오.
이 질문에는 이미 답변이 있습니다.
JavaScript 변수로 출력하기 위해 PHP 문자열을 인코딩하는 가장 쉬운 방법은 무엇입니까?
따옴표와 줄 바꿈이 포함 된 PHP 문자열이 있습니다. 이 문자열의 내용을 JavaScript 변수에 넣어야합니다.
일반적으로, 나는 단지 JavaScript 파일을 PHP 파일로 만들었습니다.
<script>
var myvar = "<?php echo $myVarValue;?>";
</script>
그러나 $myVarValue
따옴표 나 줄 바꿈이 포함되어 있으면 작동하지 않습니다 .
다른 사람의 답변을 확장 :
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
</script>
사용 ()로 json_encode를 요구한다 :
- PHP 5.2.0 이상
$myVarValue
UTF-8 (또는 US-ASCII)로 인코딩
UTF-8은 완전한 유니 코드를 지원하므로 즉시 변환하는 것이 안전해야합니다.
json_encode
슬래시를 이스케이프 처리 하기 때문에 포함 된 문자열도 </script>
스크립트 블록으로 인쇄하기 위해 안전하게 이스케이프됩니다.
JSON으로 인코딩
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
나는 비슷한 문제가 있었고 다음이 최선의 해결책이라는 것을 이해합니다.
<script>
var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>
그러나 micahwittman이 게시 한 링크 는 약간의 인코딩 차이가 있음을 나타냅니다. PHP의 rawurlencode()
기능은 RFC 1738 을 준수하는 것으로 여겨지 지만 Javascript에는 그러한 노력이 없었습니다 decodeURIComponent()
.
편집증 버전 : 모든 단일 문자 탈출 .
function javascript_escape($str) {
$new_str = '';
$str_len = strlen($str);
for($i = 0; $i < $str_len; $i++) {
$new_str .= '\\x' . sprintf('%02x', ord(substr($str, $i, 1)));
}
return $new_str;
}
편집 :json_encode()
적절하지 않은 이유 는 때로는 "
생성 되지 않도록해야하기 때문입니다.
<div onclick="alert(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>
또는
<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>
아래의 Micah 솔루션은 사용자 정의 해야하는 사이트가 UTF-8이 아니므로 json을 사용할 수 없으므로 저에게 효과적이었습니다. 투표를했지만 담당자가 충분하지 않습니다.
function escapeJavaScriptText($string)
{
return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}
그래도 실행하지 마십시오 addslashes()
. HTML 페이지와 관련하여 HTML 파서가 </script>
태그를 볼 수 있으며 심지어 문자열 중반에도 JavaScript의 끝이라고 가정합니다.
<?php
$value = 'XXX</script><script>alert(document.cookie);</script>';
?>
<script type="text/javascript">
var foo = <?= json_encode($value) ?>; // Use this
var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
숨겨진 DIV에 삽입 한 다음 DIV의 innerHTML을 JavaScript 변수에 지정할 수 있습니다. 당신은 아무것도 탈출에 대해 걱정할 필요가 없습니다. 깨진 HTML을 넣지 마십시오.
당신은 시도 할 수 있습니다
<script type="text/javascript">
myvar = unescape('<?=rawurlencode($myvar)?>');
</script>
하지마 Ajax를 사용
data-*
하여 HTML의 속성 또는 다른 의미가있는 속성에 넣으십시오 . 인라인 스크립트를 사용하면 페이지가 더 커지고 안전하지 않거나 사용자가 레이아웃을 망칠 수 있습니다 .… 당신은 더 안전한 기능을합니다 :
function inline_json_encode($obj) { return str_replace('<!--', '<\!--', json_encode($obj)); }
htmlspecialchars
기술
string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )
특정 문자는 HTML에서 특별한 의미가 있으며, 의미를 보존하려면 HTML 엔티티로 표시해야합니다. 이 함수는 이러한 변환 중 일부가 포함 된 문자열을 반환합니다. 번역은 일상적인 웹 프로그래밍에 가장 유용한 번역입니다. 모든 HTML 문자 엔터티를 번역해야하는 경우 대신 htmlentities ()를 사용하십시오.
이 기능은 게시판 또는 방명록 응용 프로그램과 같이 사용자 제공 텍스트에 HTML 마크 업이 포함되지 않도록하는 데 유용합니다.
수행 된 번역은 다음과 같습니다.
* '&' (ampersand) becomes '&'
* '"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes ''' only when ENT_QUOTES is set.
* '<' (less than) becomes '<'
* '>' (greater than) becomes '>'
http://ca.php.net/htmlspecialchars
이것이 나쁜 습관인지 아닌지 확실하지 않지만 팀과 나는 혼합 된 HTML, JS 및 PHP 솔루션을 사용하고 있습니다. JS 변수로 가져 오려는 PHP 문자열로 시작하여 다음과 같이 호출합니다.
$someString
다음으로 인 페이지 숨겨진 양식 요소를 사용하고 값을 문자열로 설정합니다.
<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>
그런 다음 document.getElementById를 통해 JS var를 정의하는 간단한 문제입니다.
<script type="text/javascript" charset="UTF-8">
var moonUnitAlpha = document.getElementById('phpString1').value;
</script>
이제 PHP 문자열 값을 가져 오려는 모든 곳에서 JS 변수 "moonUnitAlpha"를 사용할 수 있습니다. 이것은 우리에게 정말 잘 작동하는 것 같습니다. 우리는 그것이 많이 사용되는지를 보게 될 것입니다.
템플릿 엔진을 사용하여 HTML을 구성하면 원하는대로 채울 수 있습니다!
XTemplates를 확인하십시오 . 멋진 오픈 소스 경량 템플릿 엔진입니다.
HTML / JS는 다음과 같습니다.
<script>
var myvar = {$MyVarValue};
</script>
'Programing' 카테고리의 다른 글
JavaScript에서 문자열을 비교하는 가장 좋은 방법은 무엇입니까? (0) | 2020.02.27 |
---|---|
Apple 개발자 프로그램이나 탈옥이없는 기기에서 iOS 앱 테스트 (0) | 2020.02.27 |
파이썬에서 '//'를 갖는 이유는 무엇입니까? (0) | 2020.02.27 |
jQuery를 사용하여 AJAX 요청에 헤더 추가 (0) | 2020.02.27 |
여러 줄 명령을 입력하는 방법 (0) | 2020.02.27 |