PHP преобразование nbsp в » «

#php #html #scripting

#php #HTML #создание сценариев

Вопрос:

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

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

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

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

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

Спасибо!

Комментарии:

1. Вы просматриваете исходный код веб-страницы или визуализируете страницу с помощью браузера? Имейте в виду, что "redamp;nbsp;wine" в исходном коде будет отображаться как "red wine" в браузере.

Ответ №1:

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

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

Если вы хотите проверить, находится ли amp;nbsp; между тегами HTML, вы должны сделать это раньше ( if заявление и т.д.) — Это будет более понятно.

Однако не используйте regexp с html — это зло.

Комментарии:

1. Хм, спасибо, я начал с использования str_replace и перешел к регулярному выражению, поскольку одним из элементов является адрес электронной почты mailto.. почему регулярное выражение злое с html?

2. @jamo_ Потратьте некоторое время на эту статью. Это стоит: codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

3. Спасибо. htmlspecialchars() исправлена моя проблема, но если регулярное выражение является плохой практикой, я посмотрю на это. приветствия!

4. Это определенно так 😉 Удачи !

Ответ №2:

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

Комментарии:

1. О, хорошо, вы сказали «на странице html» и сказали, что amp;reg; «сработало», поэтому я предположил, что вы просматриваете вывод HTML.

Ответ №3:

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

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

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

Ответ №4:

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

 echo htmlspecialchars( $item );
  

Комментарии:

1. Ах, это было великолепно!! спасибо 🙂 Я даже использовал это на другой странице — не могу поверить, что забыл об этом!

Ответ №5:

Согласно 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-x08x10x0Bx0Cx0E-x19x7F]'.
 '|[x00-x7F][x80-xBF] '.
 '|([xC0xC1]|[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 );