PHP中的htmlentities,但保留html标签 [英] htmlentities in PHP but preserving html tags
问题描述
我想将字符串中的所有文本转换为html实体,但保留HTML标记,例如:
<< ; p>< font style =color:#FF0000>Camiónespañol< / font>< / p>
应该被翻译为:
< p>< font style =color:#FF0000> Cami& oacute; n espa& ntilde; ol< / font>< / p>
有什么想法?
您可以使用 htmlentities使用的对应字符列表=>实体
,功能为 get_html_translation_table
;请考虑以下代码:
$ list = get_html_translation_table(HTML_ENTITIES);
var_dump($ list);
(您可能想在手册中查看该函数的第二个参数 - 也许您需要将其设置为与默认值不同的值)
它会得到如下所示的结果:
array
''=>字符串'& nbsp;'(长度= 6)
'¡'=> string'& iexcl;'(length = 7)
'¢'=> string'& cent;'(length = 6)
'''=> string'& pound;'(length = 7)
'¤'=> string'& curren;'(length = 8)
....
....
....
'ÿ'=> 'string'& quot;'(length = 6)
''''= ;'(length = 4)
'>'=> string'& gt;'(length = 4)
'&'=> string'& amp;' = 5)
现在,删除您不需要的对应关系:
unset($ list [''''));
unset($ list ['<']);
unset($ list ['>']);
unset($ list ['&']);
现在,您的列表中包含所有对应字符= htmlentites使用的实体,除少数字符外你不想编码。
现在,你只需要提取键和值的列表:
$ search = array_keys($ list);
$ values = array_values($ list);
最后,您可以使用str_replace进行替换:
$ str_in ='< p>< font style =color:#FF0000>Camiónespañol< / font>< / p>';
$ str_out = str_replace($ search,$ values,$ str_in);
var_dump($ str_out);
您得到:
这看起来像你想要的; - )
编辑:好吧,除了编码问题(该死的UTF-8,我想 - 我试图找到一个解决方案,并会再次编辑)
第二次编辑几分钟后:看起来您必须使用 utf8_encode
在 $ search
列表中,在调用 str_replace
之前: - (
$ p
$ b
$ search = array_map('utf8_encode',$ search);
在调用 array_keys
和调用 str_replace
。
而且,这一次,你真的应该得到你想要的:
string'< p>< font style =color:#FF0000> Cami& oacute; n espa& ntilde; ol< / font>< / p>'(length = 70) $ b
以下是代码的完整部分:
$ 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ónespañol< / font>< / p> ';
$ str_out = str_replace($ search,$ values,$ str_in);
var_dump($ str_in,$ str_out);
完整输出:
string'< p>< p> font style =color:#FF0000>Camiónespañol< / font>< / p>'(length = 58)
string'< p>< font style =color:#FF0000> ;长度= 70)
$ b; Cami& oacute; n espa& ntilde; ol< / font>< / p> $ b
这一次,它应该没问题^^
它并不真正适合一行,可能不是最优化的解决方案;但它应该可以正常工作,并具有允许哟的优势你添加/删除任何对应字符=>你需要或不需要的实体。
玩得开心!
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标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!