問題描述
我想將字符串中的所有文本轉換為 html 實體,但保留 HTML 標簽,例如:
<p><font style="color:#FF0000">Camión espa?ol</font></p>
應該翻譯成這樣:
<p><font style="color:#FF0000">Camión español</font></p>
有什么想法嗎?
您可以獲取實體noreferrer">htmlentities
,帶有函數 get_html_translation_table
;考慮這個代碼:
$list = get_html_translation_table(HTML_ENTITIES);var_dump($list);
(您可能需要檢查手冊中該函數的第二個參數——也許您需要將其設置為與默認值不同的值)
它會給你這樣的東西:
數組' ' =>字符串 ' '(長度=6)'?' =>字符串 '&ieexcl;'(長度=7)'¢' =>字符串 '¢'(長度=6)'£' =>字符串'&磅;'(長度=7)'¤' =>字符串 '¤'(長度=8)............'?' =>字符串 'ÿ'(長度=6)'"' => 字符串 '"'(長度=6)'<'=>字符串 '<'(長度=4)'>'=>字符串 '>'(長度=4)'&'=>字符串 '&'(長度=5)
現在,刪除您不想要的對應關系:
unset($list['"']);取消設置($list['<']);未設置($list['>']);取消設置($list['&']);
您的列表現在包含 htmlentites 使用的所有對應字符 => 實體,除了您不想編碼的少數字符.
現在,您只需要提取鍵和值的列表:
$search = array_keys($list);$values = array_values($list);
最后,您可以使用 str_replace 進行替換:
$str_in = '<p><font style="color:#FF0000">Camión espa?ol</font></p>';$str_out = str_replace($search, $values, $str_in);var_dump($str_out);
你得到:
string '<p><font style="color:#FF0000">Camión español</font></p>'(長度=84)
這看起來像你想要的 ;-)
嗯,除了編碼問題(該死的 UTF-8,我想 - 我正在嘗試為此找到解決方案,并將再次編輯)>
幾分鐘后的第二次在調用 str_replace
之前,您似乎必須在 $search
列表中使用 utf8_encode
:-(
這意味著使用這樣的東西:
$search = array_map('utf8_encode', $search);
在調用 array_keys
和調用 str_replace
之間.
而且,這一次,你真的應該得到你想要的:
string '<p><font style="color:#FF0000">Camión español</font></p>'(長度=70)
這是代碼的完整部分:
$list = get_html_translation_table(HTML_ENTITIES);未設置($list['"']);取消設置($list['<']);未設置($list['>']);取消設置($list['&']);$search = array_keys($list);$values = array_values($list);$search = array_map('utf8_encode', $search);$str_in = '<p><font style="color:#FF0000">Camión espa?ol</font></p>';$str_out = str_replace($search, $values, $str_in);var_dump($str_in, $str_out);
以及完整的輸出:
string '<p><font style="color:#FF0000">Camión espa?ol</font></p>'(長度=58)字符串 '<p><font style="color:#FF0000">Camión español</font></p>'(長度=70)
這次應該可以了^^
它并不適合在一行中,可能不是最優化的解決方案;但它應該可以正常工作,并且具有允許您添加/刪除任何對應字符 => 您需要或不需要的實體的優點.
玩得開心!
I want to convert all texts in a string into html entities but preserving the HTML tags, for example this:
<p><font style="color:#FF0000">Camión espa?ol</font></p>
should be translated into this:
<p><font style="color:#FF0000">Camión español</font></p>
any ideas?
You can get the list of correspondances character => entity used by htmlentities
, with the function get_html_translation_table
; consider this code :
$list = get_html_translation_table(HTML_ENTITIES);
var_dump($list);
(You might want to check the second parameter to that function in the manual -- maybe you'll need to set it to a value different than the default one)
It will get you something like this :
array
' ' => string ' ' (length=6)
'?' => string '¡' (length=7)
'¢' => string '¢' (length=6)
'£' => string '£' (length=7)
'¤' => string '¤' (length=8)
....
....
....
'?' => string 'ÿ' (length=6)
'"' => string '"' (length=6)
'<' => string '<' (length=4)
'>' => string '>' (length=4)
'&' => string '&' (length=5)
Now, remove the correspondances you don't want :
unset($list['"']);
unset($list['<']);
unset($list['>']);
unset($list['&']);
Your list, now, has all the correspondances character => entity used by htmlentites, except the few characters you don't want to encode.
And now, you just have to extract the list of keys and values :
$search = array_keys($list);
$values = array_values($list);
And, finally, you can use str_replace to do the replacement :
$str_in = '<p><font style="color:#FF0000">Camión espa?ol</font></p>';
$str_out = str_replace($search, $values, $str_in);
var_dump($str_out);
And you get :
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=84)
Which looks like what you wanted ;-)
Edit : well, except for the encoding problem (damn UTF-8, I suppose -- I'm trying to find a solution for that, and will edit again)
Second edit couple of minutes after : it seem you'll have to use utf8_encode
on the $search
list, before calling str_replace
:-(
Which means using something like this :
$search = array_map('utf8_encode', $search);
Between the call to array_keys
and the call to str_replace
.
And, this time, you should really get what you wanted :
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=70)
And here is the full portion of code :
$list = get_html_translation_table(HTML_ENTITIES);
unset($list['"']);
unset($list['<']);
unset($list['>']);
unset($list['&']);
$search = array_keys($list);
$values = array_values($list);
$search = array_map('utf8_encode', $search);
$str_in = '<p><font style="color:#FF0000">Camión espa?ol</font></p>';
$str_out = str_replace($search, $values, $str_in);
var_dump($str_in, $str_out);
And the full output :
string '<p><font style="color:#FF0000">Camión espa?ol</font></p>' (length=58)
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=70)
This time, it should be ok ^^
It doesn't really fit in one line, is might not be the most optimized solution ; but it should work fine, and has the advantage of allowing you to add/remove any correspondance character => entity you need or not.
Have fun !
這篇關于PHP 中的 htmlentities 但保留 html 標簽的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!