對于使用PHP的人來說,我們都知道PHP在處理字符串時會應用一些內部函數對字符串進行轉義,將特定字符替換成對應的實體,以便在html等上下文中呈現。這些內部函數包括htmlentities、htmlspecialchars、addslashes等。
不過有時候,我們在某些情況下需要原樣輸出字符串,而不需要經過這些函數的處理,這可能包括在一些API接口中返回純文本結果或是一些特定格式的數據等場景。那么,在PHP中我們該如何實現不轉譯字符串的輸出呢?
首先,我們看一下使用內部函數進行轉義時的情況:
<?php $str = "<script>alert('hello world')</script>"; echo htmlentities($str); ?>
上面的代碼會將字符串中的尖括號、雙引號等字符替換成對應的實體,輸出結果如下:
<script>alert('hello world')</script>
而如果我們不想要字符串被轉義,可以使用PHP的“heredoc”語法,將字符串包含在兩個“<<<”之間:
<?php $str = "<<<EOD <script>alert('hello world')</script> EOD; echo $str; ?>
上面的代碼不會對字符串進行任何轉義,輸出結果如下:
<script>alert('hello world')</script>
除了“heredoc”語法之外,我們還可以使用另一種語法——“nowdoc”語法。它的用法和“heredoc”語法類似,只是在外層使用單引號進行包裹:
<?php $str = <<<'EOD' <script>alert('hello world')</script> EOD; echo $str; ?>
上面的代碼同樣會原樣輸出字符串,不會進行任何轉義,輸出結果和前面的代碼一樣。
不過需要注意的是,使用“heredoc”或“nowdoc”語法時,結束符(在上面代碼中的“EOD”)不能和代碼中已有的字符串內容重復。否則會導致語法錯誤。
此外,在一些情況下,我們也可以簡單地使用PHP的原始輸出函數“echo”:
<?php $str = "<script>alert('hello world')</script>"; echo $str; ?>
雖然前面我們提到了使用echo輸出會自動轉義字符串,但其實在某些情況下,echo輸出的字符串并不會被轉義,比如在如下情景:
<?php $str = "alert('hello world')"; ?> <script><?php echo $str; ?></script>
上面的代碼中,$str變量中的字符串會原樣輸出到<script>標簽內,不會被轉義。
總之,對于不想讓PHP內部函數處理字符串的情況,我們可以使用“heredoc”或“nowdoc”語法包裹字符串,也可以使用PHP的原始輸出函數“echo”,或是在特定情況下使用echo輸出字符串,從而實現不轉義字符串的輸出。