За последние 24 часа нас посетили 18263 программиста и 1597 роботов. Сейчас ищут 893 программиста ...

Помогите с обработкой HTML

Тема в разделе "Прочие вопросы по PHP", создана пользователем Tinvul, 4 июн 2009.

  1. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    Доброго времени суток

    ПОмогите пожалуйста с обработкой текста в HTML
    Скрипт получает текст с html разметкой из БД. надо его обрезать до первого обзаца. и из последних трех слов сделатьссылку. При этом точно неизвестно, чем будет определятся переход на новую строку(или <br>, или <div>, или <p>)...
     
  2. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    PHP:
    1.  
    2. <?
    3.  
    4. $string = "some text here it is a hyperlink <br> some other text<div>third part of text</div>";
    5. echo $string;
    6. $string = str_replace(array("<br>", "<p>", "<div>"), "#_#", $string);
    7. $string_arr = explode("#_#", $string);
    8. $string_arr = preg_replace("/\s+/", " ", trim($string_arr[0]));
    9. $string_arr = explode(" ", $string_arr);
    10. $c = count($string_arr);
    11. $string_arr[$c-3] = "<a href='#'>".$string_arr[$c-3]." ".$string_arr[$c-2]." ".$string_arr[$c-1]."</a>";
    12. unset($string_arr[$c-2]);
    13. unset($string_arr[$c-1]);
    14.  
    15. echo implode(" ", $string_arr);
    16.  
    17. ?>
    18.  
    такой забавный вариант, но вроде работает
     
  3. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    VItalijs, спасибо) правда я сам уже сделал, но там неочень вариант.
    а можно коментарии к 5 и 6 строчки, а то что-то я немогу чуть понять...
     
  4. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    ну я так первый абзац обрезал ))
     
  5. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    аа))) понил)
    еще раз спасибо)
     
  6. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    VItalijs,
    PHP:
    1. <?
    2. $string = "а что, если в первой строке будут слова_с_подчеркиваниями? <br> some other text<div>third part of text</div>";
    3. // Скорее так как то
    4. $string_arr = preg_split('/\<(br|p|div)\>/', $string)
    5.  
     
  7. VItalijs

    VItalijs Активный пользователь

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    PHP:
    1. <? $string_arr = preg_replace("/\s+/", " ", trim($string_arr[0]));  ?>
    в эту регулярку можно засунуть любые разделители какие хотите.

    PHP:
    1.  <? $string_arr = preg_split('/\<(br|p|div)\>/', $string) ?>
    не люблю регулярки, да и работают они медленнее вроде как.
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    я говорю про достаточно глупый подход str_replace(array("<br>", "<p>", "<div>"), "#_#", $string);
    Хотя да, я ошибся, ты бъешь не по _, а по #_#, но мало ли, вдруг ктото смайл такой поставит.
    Смотри. То, что ты делаешь тремя операциями замены и одной - поиска и разбивания строки, я делаю одним поиском по регулярному выражению. Как-то на этом форуме я уже сказал что-то типа: "Когда можно отказатся от тяжелой регулярки - от нее стоит отказатся". Так вот - иногда лучше сделать регуляркой.
     
  9. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    TheShock ну смайл не поставят - это точно) обьясни пожалуйста раздницу, а то состроками я почти неработал
     
  10. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Ну смотри. Вот как бы ты искал, заканчивается ли данная строка на определенную подстроку? Строковыми функциями получил бы длину подстроки, последний индекс ее вхождения и приравнял бы сумму этих параметров ко всей длине строки?
    А я бы сделал чтото типа такого:
    PHP:
    1. <?php
    2.   $endsWith = 'here'; // False
    3.   $endsWith = 'string'; // True
    4.   var_dump(!!preg_match("/$endsWith&/", "Here is our test string"));
    5. ?>
    Это к тому, что иногда регулярные выражения лучше (и даже быстрее, если проверить ;)), чем строковые. А теперь смотри пример выше. Допустим, ты действительно не будешь использовать в тексте #_#. Но. Ты трижды проходишь по строке и заменяешь возможные значения на этот псевдоэлемент. А что, если правила поиска станут тяжелее? Например, надо будет не <div|p>, а <div|p class='{а тут - 10 возможных значений}'>, например, если автор захочет покрасить каждый параграф как зебру тремя цветами, и т.п. Так у тебя распухнет это выражение, что ужос. А я сделаю так:
    PHP:
    1. <? $string_arr = preg_split('/\<\/?(br|p|div)(.*?)\>/', $string) ?>
    В принципе, это учтет практически все возможные варианты, даже те, о которых я пока не знаю.

    Согласен с моей логикой?

    Скажу так - не стоит боятся регексов. Ты врядли сможешь написать быстрее без их использования что-то кроме примитивной логики. Всему нужен свой подход. Иногда - РегВыр, иногда - Строковые функции, иногда - чтото другое.
     
  11. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    TheShock
    Согласен, у тя более оптимизированный метод, для тежелых текстов пойдет.
    но в моем случае надо то что пошустрее, так как условия заранее известны, зебр паласатых точно не будет)

    я вообще использую следующие
    PHP:
    1. //Статья может начинаться с Заголовка, и точно уже известно чем заканчивается
    2.     $content = "<h3>HEADER 3</h3><div>NURA IS THE BEST GAME</div>IN THE WORLD";
    3.     $a = strpos($content, "</div>");
    4.     $b = substr($content, 0, $a+6);
     
  12. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    TheShock
    мне кажется, что в моем случае этот вариант будет более шустрым...
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    а вообще, обычно, ставится чтото типа бб-кода: [cut], по которому и обрезается
     
  14. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    думал над этим - неподходит. редактировать будет отдельный человек, который неразбирается в этом, может и забыть
     
  15. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Тогда, в общем то, код выше решает твою задачу, пока тебе не надо будет его расширять
     
  16. Tinvul

    Tinvul Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    31
    Симпатии:
    0
    Адрес:
    Хабаровск
    на это я и расчитываю...
    а вот твой вариант - точто надо, когда буду писать модули для сайта с большим количеством редакторов... вот там вот точно нельзя будет уследить за стилем
     
  17. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Знаешь, один мой друг, когда я допустил возможность коллизии в миллиардную долю процента сказал:
    "Ничего себе, а я думал, что ты - перфекционист". После этого я увеличил длину хеша вдвое. На что он сказал: "Все-равно как-то ты слабо в этот раз".

    Так вот - стоит учесть ВСЕ варианты. Что я тебе рекомендую делать изначально ;)