我一直试图让这个工作在过去的3个小时内工作,但无济于事。
<?php
foreach ($array as $item) {
$item = preg_replace("~ (?=[^<>]*(<|$))~", " ", $item);
logWrite($item);
echo $item;
}
?>
$array
由一系列项目组成,例如"bread"
,"cheese"
,"red wine"
- regexp用于确保它仅适用于打开和关闭html标记之间的文本(此处有人提供)。
无论如何问题是,当我写入日志时 - 它出现在"bread"
,"cheese"
,"red wine"
但是回显(我也试过打印)在html上页面与"bread"
,"cheese"
,"red wine"
保持不变。
如果我使用其他字符替换,例如®
它运作正常。有什么想法为什么这个特定的实体不起作用?我觉得我的字符集都很好。
谢谢!
答案 0 :(得分:3)
您不需要在此处使用正则表达式。试试:
$item = str_replace(' ', ' ', $item);
如果你想检查HTML标签之间是否
,你应该在(if
声明等)之前进行检查 - 它会更清楚。
但是不要在html中使用regexp - 这很邪恶。
答案 1 :(得分:1)
是“非破坏空间”的HTML实体,因此它将在HTML文档中显示为空格(而不是实际字符),因此您不会注意到{{1和一个普通的空间。查看源代码,您将看到它。
答案 2 :(得分:0)
假设您对解码所有HTML实体感兴趣,可以使用html_entity_decode
:
http://www.php.net/manual/en/function.html-entity-decode.php
这比尝试使用正则表达式要简单得多。
答案 3 :(得分:0)
如果要在HTML网页上显示“原始”HTML内容,则应使用htmlspecialchars()
:
echo htmlspecialchars( $item );
答案 4 :(得分: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 );