Категории публикаций
Подписка на рассылку по Email
новости (подписчиков: 4)
комментарии (подписчиков: 2)

Отменить подписку
Популярные публикации
Интересный опрос
Знаете ли вы особенности PHP 5.4 ?

Да, знаю
Нет не знаю
А что это такое?
Поблагодарить автора
donate
1B4ZZ2PXUd9E7AqEB82AqFnkpk2bt5hQG7

Интересный нюанс с пробелами при чистке текстов функцией preg_replace

Размещено в категории: PHP

Программирование - это магияПри чистке текстов регулярными выражениями в PHP я столкнулся с интересным глюком, как выяснилось потом это не глюк а интересный нюанс, который отнял у меня достаточно много времени.

Дело в том что мне нужно было очистить пустые абзацы в множестве статей в самом начале текста,так как они там не нужны и портят общий вид статьи.

Для чистки я решил использовать регулярные выражения, так как в данном случае простой функцией замены подстроки не обойтись беж лишних телодвижений.

Пустые абзаци были  предоставлены примерно такими строками HTML кода:

<p></p>
<p> </p>
<p>&nbsp;&nbsp;</p>
<p>&#160;</p>
<p>    </p>

Все чистилось php кодом с  регулярным выражением:

$txt=preg_replace( '#^<p>(&nbsp;|s|&#160;)+</p>#is' , '' , $original_text );

Почистились все статьи что местили ненужные пустые строки, но со временем я заметил что в некоторых присутствует пустой абзац вначале, посмотрев код я увидел вот какой код:

<p>  </p>

Странно...вроде бы простые теги и несколько пробелов, может я что-то забыл…а ну-ка прогоню я статьи еще раз своей регуляркой – в итоге ничего не изменилось. Ну что же за мистика? - копирую я этот кусок кода с пробелами в буфер и бросаю в конвертер Text – to – Hex (http://www.swingnote.com/tools/texttohex.php)  и что же я вижу:

Hex Spaced:
3c 70 3e 20 20 20 20 20 3c 2f 70 3e

Вроде бы ничего необычного – x20 это код обычного пробела.
Изменил я свою регулярку вот так специально для данного случая, должно проканать:

$txt=preg_replace( '#^<p>x20+</p>#is' , '' , $original_text );

В итоге прогнав подопытный текст такой регуляркой он не изменился – теги вначале с пробелами остались как и раньше. Что за...? Может при копировании в буфер обмена браузер конвертирует символы…нужно как-то это все проверить.
 
Решил я пойти иным путем чтобы узнать где собака зарыла свою кость:
Сохранил текст в файл с помощью функции file_put_contents, после этого нужно было просмотреть текстовый файл в хексе(HEX). Есть у меня хорошая программулина под названием HxD – Бесплатный HEX редактор (http://mh-nexus.de/en/hxd/), вот ее я и использовал для открытия нашего текстового файла с загадочным текстом.
А теперь самое интересное – вот что я увидел:

<p>     </p>
3C 70 3E A0 20 A0 A0 A0 3C 2F 70 3E

Так вот оно что, присутствует символ с кодом A0, а символ с кодом  20 – это простой символ пробела. Заглянув в таблицу символов я нашел этот символ – это тот же самый пробел только НЕРАЗРЫВНЫЙ:

Dec Hex Symbol HTML Number HTML name Description
160 A0   &#160; &nbsp; non-breaking space
32 20   &#32;   space

Теперь я переписал функцию чистки с регулярным выражением и все почистилось на ура:

$txt=preg_replace( '#^<p>[xA0x20]+</p>#is', '' , $original_text );

Я получил интересный опыт и успешно решил проблему, хотя потратил не спеша несколько часов своего времени на то чтобы разобраться с данным нюансом.  Вот такая вот магия...

P.S. Работы проводились на PHP 5.3;

 (5/5) голосов: 2   просмотров: 1396




Добавить комментарий captcha