PHP конвертирует nbsp в "" - PullRequest
       14

PHP конвертирует nbsp в ""

0 голосов
/ 04 ноября 2011

Я пытался заставить это работать в течение последних 3 часов, но безрезультатно.

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

$array состоит из списка элементов, например, "bread", "cheese", "red wine" - регулярное выражение существует, чтобы убедиться, что оно работает только над текстом между html-тегами open и close (любезно предоставлено кем-то еще здесь).

В любом случае проблема в том, что когда я пишу в журнал - он выглядит как "bread", "cheese", "red&nbsp;wine", но эхо (я также пробовал печатать) на html-странице остается неизменным с "bread", "cheese", "red wine".

Если для замены я использую другой символ, например &reg; работает нормально. Есть идеи, почему этот конкретный объект не работает? Я думаю, что мои кодировки все в порядке.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 04 ноября 2011

Вам не нужно использовать регулярное выражение здесь.Попробуйте:

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

Если вы хотите проверить, находится ли &nbsp; между тегами HTML, вам следует сделать это раньше (if оператор и т. Д.) - это будет более понятно.1007 * Однако не используйте регулярные выражения с html - это зло.

1 голос
/ 04 ноября 2011

&nbsp; - это HTML-сущность для «неразрывного пробела», поэтому она будет выглядеть как пробел (не фактические символы) в документе HTML, поэтому вы не заметите разницу между &nbsp; инормальное пространство.Посмотрите исходный код, и вы увидите его.

0 голосов
/ 14 декабря 2011

Согласно 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 );
0 голосов
/ 04 ноября 2011

Если вы хотите отобразить «сырой» контент HTML на странице HTML, вы должны использовать htmlspecialchars():

echo htmlspecialchars( $item );
0 голосов
/ 04 ноября 2011

Предполагая, что вы заинтересованы в декодировании всех сущностей HTML, вы можете использовать html_entity_decode:

http://www.php.net/manual/en/function.html-entity-decode.php

Это гораздо проще, чем пытаться использовать регулярные выражения.

...