HTML — PHP preg_replace браузер и консоль различное поведение

У меня странная проблема с PHP.

Я использую этот код для чтения HTML-страницы

$fh = fopen('html_page.htm', 'r+');
$html_page = '';

while (!feof($fh))
{
$html_page .= fread($fh, 1024);
}
fclose($fh);

И на этой странице у меня есть что-то вроде этого:

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>

А вот так:

<span>&nbsp;&nbsp;324.85&nbsp;SGD&nbsp;</span>

Поэтому я хочу удалить содержимое этих тегов из всех &nbsp; так что первый пример превращается в пустую строку, а второй пример в это:

324.85 SGD

Мое решение было таким: (переменная $ str содержит содержимое тегов, только содержимое, а не теги)

$str = trim(preg_replace('/[^\w+ .,:;]/', ' ', $str));

Это хорошо работало, когда я загружал свой скрипт через браузер.
Хотя я получал это:

324.85  SGD // Inner extra spaces not removed

Примечание: мой скрипт загружен, а не HTML-страница, он все еще читается в вызове через fread ().

Я отображаю вывод в браузере (и да, я смотрю на источник HTML), и он ведет себя хорошо.
Однако, когда я запускаю консоль через скрипт и он все равно читает ту же HTML-страницу, в основном все то же самое, за исключением того, что я сохраняю вывод в файл .txt или отображаю его в консоли, я получаю это.

Первый пример со всеми &nbsp;

    Â

И второе со значениями, смешанными с &nbsp;

  324.85 SGDÂ

И это не то, что эти символы были там, но не отображались при запуске через браузер, потому что в программе я проверяю пустое строковое значение (первый пример), и оно действительно пусто для первого примера.

Решение, которое я нашел, состоит в следующем:

$str = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $str));

Работает в обоих случаях.
Выходы:
324,85 SGD

Итак, вопрос в том, почему PHP ведет себя так по-разному при запуске через браузер и консоль в этом случае?

И каков наилучший способ нормализовать строку, чтобы удалить лишние внутренние пробелы?

Из этого:

324.85  SGD

к этому

324.85 SGD

Но, конечно, мне бы хотелось, чтобы он работал на всех строках, независимо от их длины.

Благодарю.

0

Решение

Похоже, что-то связано с кодировкой символов. Я бы сказал, что ваш HTML — это UTF-8, а ваша консоль не поддерживает это или что-то подобное.

Кодировка символов — очень важная вещь для понимания при работе с символами.

Я думаю, что может сработать, чтобы изменить вывод на latin1, но это довольно дикое предположение:
Поэтому попробуйте обернуть utf8_decode () вокруг того, что вы пытаетесь вывести.

Редактировать: Выше было мое первое предположение, но после небольшого поиска в Google я обнаружил, что, вероятно, fread () — ваша проблема. Пожалуйста, посмотрите на:
установить кодировку utf-8 для fread fwrite
а также
http://php.net/manual/en/function.fopen.php#104325

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]