2011-11-04 39 views
0

我一直试图让这个工作过去3小时,但无济于事。PHP将nbsp转换为“”

<?php 
    foreach ($array as $item) { 
     $item = preg_replace("~ (?=[^<>]*(<|$))~", "&nbsp;", $item); 
     logWrite($item); 
     echo $item; 
    } 
?> 

$array由一系列项目组成,例如, "bread","cheese""red wine" - 正则表达式可以确保它只能用于打开和关闭html标记之间的文本(本文提供的其他人)。

但无论如何,问题是,当我写的日志 - 它出来为"bread""cheese""red&nbsp;wine"但回声(我曾尝试打印以及)HTML页面上为"bread""cheese""red wine"不变。

如果我使用不同的字符来代替例如&reg;它工作正常。任何想法为什么这个特定的实体不工作?我认为我的编码都很好。

谢谢!

+0

您正在查看网页的源代码还是使用浏览器呈现网页?请注意,来源中的''红色 葡萄酒''将被浏览器显示为''红葡萄酒''。 – Anson

回答

3

这里不需要使用regexp。试着用:

$item = str_replace('&nbsp;', ' ', $item); 

如果你想检查是否&nbsp;是HTML标记之间,你应该之前做(if声明,等等) - 这将是更加清晰。

但是,不要使用html的正则表达式 - 它是邪恶的。

+0

嗯,谢谢我开始使用str_replace并移动到正则表达式,因为其中一个项目是一个电子邮件地址mailto ..为什么正则表达式邪恶与HTML? –

+0

@jamo_在本文中花费一段时间。值得:http://www.codinghorror。com/blog/2009/11/parsing-html-the-cthulhu-way.html – hsz

+0

谢谢。 'htmlspecialchars()'解决了我的问题,但如果正则表达式是不好的练习,我会仔细看看。干杯! –

1

&nbsp;是一个HTML实体,用于“non-breaking space”,所以它将在HTML文档中显示为空格(不是实际字符),因此您不会注意到&nbsp;与普通空间之间的区别。查看源代码,你会看到它。

+0

谢谢,我正在查看源代码。 –

+0

噢,你已经说过“在html页面上”,并且说'®'“工作过”,所以我认为你正在查看HTML输出。 –

0

当你想显示HTML页的“原始” HTML内容,你应该使用htmlspecialchars()

echo htmlspecialchars($item); 
+0

啊,辉煌就是这样!谢谢:-)我甚至在另一个页面上使用过 - 不能相信我忘了! –

0

http://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/

我有一些字符,解析器不知道如何插入,因为它超出了UTF8格式的字节范围。一些PHP函数,如iconv,仍然让一些非UTF8字符通过它破坏分析器。 preg_replace只是基于它的字节序列撕掉任何非UTF8字符,并用问号替换它。

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? 
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. 
'|[\x00-\x7F][\x80-\xBF]+'. 
'|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. 
'|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. 
'|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', 
'?', $some_string); 

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? 
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. 
'|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string);