У меня странная проблема с PHP.
Я использую этот код для чтения HTML-страницы
$fh = fopen('html_page.htm', 'r+');
$html_page = '';
while (!feof($fh))
{
$html_page .= fread($fh, 1024);
}
fclose($fh);
И на этой странице у меня есть что-то вроде этого:
<span> </span>
А вот так:
<span> 324.85 SGD </span>
Поэтому я хочу удалить содержимое этих тегов из всех так что первый пример превращается в пустую строку, а второй пример в это:
324.85 SGD
Мое решение было таким: (переменная $ str содержит содержимое тегов, только содержимое, а не теги)
$str = trim(preg_replace('/[^\w+ .,:;]/', ' ', $str));
Это хорошо работало, когда я загружал свой скрипт через браузер.
Хотя я получал это:
324.85 SGD // Inner extra spaces not removed
Примечание: мой скрипт загружен, а не HTML-страница, он все еще читается в вызове через fread ().
Я отображаю вывод в браузере (и да, я смотрю на источник HTML), и он ведет себя хорошо.
Однако, когда я запускаю консоль через скрипт и он все равно читает ту же HTML-страницу, в основном все то же самое, за исключением того, что я сохраняю вывод в файл .txt или отображаю его в консоли, я получаю это.
Первый пример со всеми
    Â
И второе со значениями, смешанными с
  324.85 SGDÂ
И это не то, что эти символы были там, но не отображались при запуске через браузер, потому что в программе я проверяю пустое строковое значение (первый пример), и оно действительно пусто для первого примера.
Решение, которое я нашел, состоит в следующем:
$str = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', ' ', $str));
Работает в обоих случаях.
Выходы:
324,85 SGD
Итак, вопрос в том, почему PHP ведет себя так по-разному при запуске через браузер и консоль в этом случае?
И каков наилучший способ нормализовать строку, чтобы удалить лишние внутренние пробелы?
Из этого:
324.85 SGD
к этому
324.85 SGD
Но, конечно, мне бы хотелось, чтобы он работал на всех строках, независимо от их длины.
Благодарю.
Похоже, что-то связано с кодировкой символов. Я бы сказал, что ваш HTML — это UTF-8, а ваша консоль не поддерживает это или что-то подобное.
Кодировка символов — очень важная вещь для понимания при работе с символами.
Я думаю, что может сработать, чтобы изменить вывод на latin1, но это довольно дикое предположение:
Поэтому попробуйте обернуть utf8_decode () вокруг того, что вы пытаетесь вывести.
Редактировать: Выше было мое первое предположение, но после небольшого поиска в Google я обнаружил, что, вероятно, fread () — ваша проблема. Пожалуйста, посмотрите на:
установить кодировку utf-8 для fread fwrite
а также
http://php.net/manual/en/function.fopen.php#104325
Других решений пока нет …