Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > str_ireplace


Автор: madFobos 16.8.2007, 22:51
Модератор: Сообщение скрыто.

Автор: madFobos 17.8.2007, 07:38
Блин, я так и не нашел ответа. Пришлось делать так:

Код

        $before = addcslashes($before, '\.\/()\"[]');
        $before = preg_replace("/\s+/", "(\xA0+|\s+)", $before);
        $document = preg_replace("/".$before."/", $after, $document);


Причем самое странное, что часть проелов документа реагирует только на \s, а часть только \xA0. Хотя по идее \s должен включать в себя \xA0 (HEX пробела). Если кто-то все таки знает ответ, сообщите, плиз.

Автор: sTa1kEr 17.8.2007, 11:49
madFobos, Код обычного пробела вовсе не 0xA0, а 0x20 http://www.asciitable.com/ Но во многих кодировках (в.т.ч. и в http://en.wikipedia.org/wiki/ISO/IEC_8859-1) так же существует еще один, так называемый, не разрывной пробел (NO-BREAK SPACE). Именно он и имеет код 0xA0. Т.ч. вполне логично, что str_ireplace() не находит пробела.

Цитата(madFobos @  16.8.2007,  22:51 Найти цитируемый пост)
Собственно рег. выражения использовать не получается, т.к. там есть в условиях и скобки и точки и пр. хрень, да и не нужно это.

Цитата(madFobos @  17.8.2007,  07:38 Найти цитируемый пост)
 $before = addcslashes($before, '\.\/()\"[]');

Для того, что бы безопасно использовать обычный шаблон в шаблоне регулярных выражениях существует функция http://us2.php.net/manual/en/function.preg-quote.php, которая экранирует все спецсимволы используемые в регулярных выражениях.

Цитата(madFobos @  17.8.2007,  07:38 Найти цитируемый пост)
Причем самое странное, что часть проелов документа реагирует только на \s, а часть только \xA0. Хотя по идее \s должен включать в себя \xA0 (HEX пробела). Если кто-то все таки знает ответ, сообщите, плиз. 

А вот тут уже, вероятно, виновата именно локаль, точнее даже кодировка локали. Т.к. к примеру в cp866 и, если не ошибаюсь, в koi8-r нету не разрывного пробела.

Автор: madFobos 17.8.2007, 18:01
Цитата(sTa1kEr @  17.8.2007,  11:49 Найти цитируемый пост)
Для того, что бы безопасно использовать обычный шаблон в шаблоне регулярных выражениях существует функция preg_quote(), которая экранирует все спецсимволы используемые в регулярных выражениях.


Спасибо, что-то как-то мимо эту функцию пропустил

Цитата(sTa1kEr @  17.8.2007,  11:49 Найти цитируемый пост)
А вот тут уже, вероятно, виновата именно локаль, точнее даже кодировка локали. Т.к. к примеру в cp866 и, если не ошибаюсь, в koi8-r нету не разрывного пробела. 


Я так понимаю, что DomDocument конвертит часть пробелов в html-представление ( ), а когда делается html_entity_decode, то получается как раз 0xA0. Судя по всему в этом и причина. И судя по тому что документ создан в ISO-8859-1, а DomDocument коннектится всегда в UTF-8, то в UTF-8 локали тоже нет неразрывного пробела.

Думаю теперь все прояснилось. В любом случае, спасибо sTa1kEr.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)