Forum Webscript.Ru

Программирование => PHP => Тема начата: Boatman от 16 Октября 2002, 19:30:32

Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 16 Октября 2002, 19:30:32
Как удалить все лишние пробелы из ХТМЛ текста, не портя тэгов? Подскажите плиз шаблон для preg_replace или стандартную функцию.

Например:

preg_replace(\'/\\\\s+/\', \' \', $string);

но тока чтоб он не делал этого внутри тэгов (между < и >).
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 16 Октября 2002, 20:05:12
А что - эта функция удаляет ЛИШНИЕ пробелы из текста?
Именно удаляет?
Я, наверное, что-то не понимаю в лишних пробелах...
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Maniac от 16 Октября 2002, 20:34:18
А почему в тегах не удалять? Ситуация бы резко упростилась... Насколько я помню, в тегах нет мест, критичных к количеству пробелов.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Tronyx от 16 Октября 2002, 22:08:08
Цитировать
А почему в тегах не удалять? Ситуация бы резко упростилась... Насколько я помню, в тегах нет мест, критичных к количеству пробелов.

Если использовать регу Boatmana то проблемы будут.


preg_replace(\'/\\s+/\', \' \', $string);
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: rembo от 17 Октября 2002, 06:23:27
А какого $#^%& их вапще удалять? :) Хтмлину оптимизировать такиим способом что ли? :)
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: ThE0ReTiC от 17 Октября 2002, 11:21:00
rembo
Ну как вариант.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 17 Октября 2002, 14:42:09
есть даже модуль под апач, который удаляет лишнее.
малораспространенный, впрочем - мод_гзип делает то же самое, и больше.

а замена вайтспейса на пробелы, я думаю, может повредить яваскрипты. там же есть зависимость от переврдов строк, кажется?
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: PilotV от 17 Октября 2002, 15:58:52
Да, удаление лишних символов - переводов строк, пробелов, табуляций - вообще не то чтобы очень однозначная вещь для разных участков кода, как-то скрипты, теги, сам текст.
А еще все забыли про тег PRE
Не думаю, что эта задача стоит того, чтобы ею заниматься.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 17 Октября 2002, 20:16:16
замечательно!

Во-первых, что если у тебя
(там два пробела);

во-вторых речь не идет ни о какой оптимизации ХТМЛ, просто нужно поработать над текстом, независимо от гипертекста, сделать из \\s+ один пробел лишь одна из необходимых вещей.

Главное что надо, это работать над тем, что между тэгами.

Тут главное сам принцип реализовать.

хелп у кого еще есть идеи.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 18 Октября 2002, 02:18:51
вот такая идея.

в цикле, пока не кончится строка, бежим по ней
strpos-ом и ищем по очереди < и >
запоминаем позицию (в начале - 0)
если нашлось <
вырезаем от запомненной позиции до позиции <
проверяем флаг. Если не тег, то
производим нужные операции.
ставим флаг ,что ищем >
конкатим отрезаное к результирующей строке.
позиция=найденая позиция.
гото 1

ну как?
должно, вроде, работать быстро и без ошибок.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: КшЫуфксрук от 18 Октября 2002, 02:33:18
Пока не встретится JavaScript c "<" или ">". Самое лучшее для такой задачи - взять толковый парсер HTML кода. Для Перла такие есть, нужно поискать для ПХП.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 18 Октября 2002, 02:48:39
для пхп есть у антонио.
а в яваскрипте может встретиться < и >?
а зачем?
можно пример посмотреть? уж очень любопытно.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: PilotV от 18 Октября 2002, 03:22:39
[OFF]Вот любители говорить ни о чем...[/OFF]
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 18 Октября 2002, 13:10:46
т. е. все, что между > и < вырезаем, обрабатываем, обработанным вставляем обратно?

А если текст полметра и там куча тэгов?

ЗЫ предполагается, что нету скриптов в тексте
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 18 Октября 2002, 13:50:15
я думаю, что текст на полметра будет обработан где-то за 0,01-0,001 секунды.
только не вырезаем и обрабатываем, а вырезаем, если не тег, то обрабатываем, и вклеиваем в новую строку. А если тег - то просто вклеиваем.
вставлять - это долго и неудобно получится.
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: mike от 18 Октября 2002, 14:50:53
Цитировать
а в яваскрипте может встретиться < и >?

Может, для динамического вывода HTML. И это не будет < > :)

Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 18 Октября 2002, 20:16:33
RomikChef
Цитировать
олько не вырезаем и обрабатываем, а вырезаем, если не тег, то обрабатываем, и вклеиваем в новую строку. А если тег - то просто вклеиваем.


если тэг, может его пропустить, не вырезая?

Я наверно неправильно твою идею понял, если не трудно объясни попонятнее
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 20 Октября 2002, 20:34:01
ты этим скриптом не исходную строку обрабатываешь!
нету в РНР функций таких - обрабатывать, не обрабатывать.
ты вырезаешь по кусочку из исходной строки, и добавляешь в новую!
вот строка
aaabbb
в процессе работы скрипта у тебя будет три итерации.
новая строка будет выглядеть так:
1.aaa
2.aaa
3.aaabbb
это если без обработки.

как тебе еще объяснить?
взял кусок из первой, посмотрел - если не тег, то обработал, и приставил к новой строке.
потом следующий кусок взял  - и так до конца строки.
тебе нужно всего две функции - strpos с третьим параметром и substr
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 21 Октября 2002, 00:51:24
спасибо, я уже понял и сделал.

Только он текст 120 КБ обрабатывает за 1 сек. без учета обработки самого содержимого тэгов. это на 500 целероне.
Многовато по-моему
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 21 Октября 2002, 01:48:59
Да, пожалуй, многовато.
но вот только рег придумать я затрудняюсь.
а дай посмотреть, как ты написал?
я у себя потестирую
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Tronyx от 21 Октября 2002, 16:29:19

preg_match_all("/([^<>]+)|(<[^<>]+>)/", $text, $text_blocks);

$size=sizeof($text_blocks[0]);
$text="";

for($i=0; $i<$size; $i++) {
    if ($text_blocks[1][$i] != "")
        $text.=preg_replace("/  +/", " ", $text_blocks[1][$i]);
    else
       $text.=$text_blocks[2][$i];
}
echo $text;
?>
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 21 Октября 2002, 19:44:19


$data = stripslashes($content);
// удаляем из юзерских данных слэши

$pos=0;
// нач. позиция

$currpos = 1;
// текущая позиция, 1 - чтоб запустить цикл.

$left=true;
// ищем сперва <

function process($thing)
{// почти пустая функция, кот. обрабатывает содержимое между тегами

 return \'Между тэгами:\'.$thing;
}

while($currpos)
{
if($left) // ищем сейчас левую скобку
{
$currpos = strpos($data, \'<\', $pos);
// pos - текущая позиция курсора
if($currpos) $result .= process(substr($data, $pos+1, $currpos-$pos-1));
// если нашли вырезаем от текущей позиции до новой и передаем в функцию process
else $result .= process(substr($data, $pos+1));
// если нет больше закрыв. скобок -  обрабатываем остаток строки
$pos = $currpos;
// перемещаем курсор
$left = false;
// ищем >
}
else
{
$currpos = strpos($data, \'>\', $pos);
if($currpos) $result .= substr($data, $pos, $currpos-$pos+1);
// то же самое, но тэги без изменений передаем.
else $result .= substr($data, $pos);
$pos = $currpos;
$left = true;
// ищем <
}
}
?>













Вроде не забыл ничего.

Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Меняздесьдавнонет от 21 Октября 2002, 21:11:48
А скрипт Tronyx-а сколько работает?
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Tronyx от 21 Октября 2002, 21:25:49
Файл в 120 Кб обрабатывается в среднем за четверть секунды, считывание файл не считалось, замерял приведённый выше код.
У меня php4.2.3, PIII - 533
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Boatman от 22 Октября 2002, 19:08:22
Цитировать
Файл в 120 Кб обрабатывается в среднем за четверть секунды, считывание файл не считалось, замерял приведённый выше код.


У меня примерно столько же, но это все равно далеко не 0.01 сек. :(
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Tronyx от 22 Октября 2002, 19:54:57
Цитировать
У меня примерно столько же, но это все равно далеко не 0.01 сек.

Не нравится пиши на СИ.;)
Название: Удаление пробелов лишних, не трогая тэги.
Отправлено: Metaller от 23 Октября 2002, 11:01:23
Лучше на асме....