PHP中的htmlentities,但保留html标签 [英] htmlentities in PHP but preserving html tags

查看:155
本文介绍了PHP中的htmlentities,但保留html标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将字符串中的所有文本转换为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&oacute;n espa&ntilde;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 '&nbsp;' (length=6)
  '¡' => string '&iexcl;' (length=7)
  '¢' => string '&cent;' (length=6)
  '£' => string '&pound;' (length=7)
  '¤' => string '&curren;' (length=8)
  ....
  ....
  ....
  'ÿ' => string '&yuml;' (length=6)
  '"' => string '&quot;' (length=6)
  '<' => string '&lt;' (length=4)
  '>' => string '&gt;' (length=4)
  '&' => string '&amp;' (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&Atilde;&sup3;n espa&Atilde;&plusmn;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&oacute;n espa&ntilde;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&oacute;n espa&ntilde;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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆