Проблема с кодировкой при использовании preg_match

Тема в разделе "PHP", создана пользователем phillip, 22 фев 2015.

Статус темы:
Закрыта.
Модераторы: latteo
  1. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Есть строка в utf-8:
    Код:
    href="/catalog/metalloplastic/valtec/"><span><i class="glyphicon glyphicon-minus"></i>
                                 Valtec</span>
    разбираю ее функцией
    Код:
    preg_match("&href=\"(.+?)\".+?</i>(.+?)</span>&is", $cat, $matches);
    $matches[2]=trim($matches[2]);
    
    На выходе во второй подмаске получается какая-то херня, вместо "Valtec" получаю " ? Valtec"
    Решил дописать вот так
    Код:
    $matches[2]=htmlentities(trim($matches[2]));
    В итоге получаю "&Acirc;&nbsp;Valtec"
    И так по всем строкам какие я разбираю.
    Как от этого избавиться?
     
  2. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    192
    Симпатии:
    233
    Если не указана кодировка при вызове htmlentities, то значение зависит от используемой версии PHP. В PHP 5.6 и старше, для значения по умолчанию используется конфигурационная опция default_charset. В PHP 5.4 и 5.5 используется UTF-8 по умолчанию. Более ранние версии PHP используют ISO-8859-1.

    Там в тексте видимо встречается неразрывный пробел, который кодируется двумя байтами \xC2\xA0.
    Можно в регулярке указать модификатор /u (PCRE_UTF8) и использовать \s* для пропуска ненужных пробелов.
    Код:
    preg_match("&href=\"(.+?)\".+?</i>\s*(.+?)</span>&isu", $cat, $matches);
    
    или str_replace("\xC2\xA0", " ", $text); а после уже обычный trim()
     
    Yulo, rebux и phillip нравится это.
  3. FLSALE

    FLSALE Писатель

    Регистр.:
    27 фев 2015
    Сообщения:
    1
    Симпатии:
    0
    Смотря, что вы хотите получить
    на вашем примере, лучше сделать так...
    preg_match("|href=\"(.+?)\"><span><i.*>.*</i>(.+?)</span>|Uis", $match, $text);
    в $match[1] получаете url
    в $match[2] получаете текст
     
  4. codeator

    codeator Постоялец

    Регистр.:
    18 май 2013
    Сообщения:
    53
    Симпатии:
    14
    Убери все htmlentities

    filter_var($stringWithHtmlEntities, FILTER_SANITIZE_STRING);
     
  5. 8Katalin8

    8Katalin8 Постоялец

    Регистр.:
    3 авг 2013
    Сообщения:
    76
    Симпатии:
    30
    AddDefaultCharset utf8 в .htaccess поставил?
     
  6. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Это вообще никак не влияет. Данная опция для хидеров, передающихся в браузер.

    А почему у вас Valtek на второй строке идет? Разеритесь аккуратно с этим, может там действительно куча каких-нибудь непечатных символов.

    Для utf-8 используйте модификатор /u
     
  7. Roma1508

    Roma1508 Создатель

    Регистр.:
    23 июл 2012
    Сообщения:
    20
    Симпатии:
    2
    Да там символ какой-то невидимый
    Поменяй регулярку как-нибудь так:
    "&href=\"(.+?)\".+?</i>([a-zA-Z]+?)</span>&is"
     
Статус темы:
Закрыта.