#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 );