Доброго времени суток ПОмогите пожалуйста с обработкой текста в HTML Скрипт получает текст с html разметкой из БД. надо его обрезать до первого обзаца. и из последних трех слов сделатьссылку. При этом точно неизвестно, чем будет определятся переход на новую строку(или <br>, или <div>, или <p>)...
PHP: <? $string = "some text here it is a hyperlink <br> some other text<div>third part of text</div>"; echo $string; $string = str_replace(array("<br>", "<p>", "<div>"), "#_#", $string); $string_arr = explode("#_#", $string); $string_arr = preg_replace("/\s+/", " ", trim($string_arr[0])); $string_arr = explode(" ", $string_arr); $c = count($string_arr); $string_arr[$c-3] = "<a href='#'>".$string_arr[$c-3]." ".$string_arr[$c-2]." ".$string_arr[$c-1]."</a>"; unset($string_arr[$c-2]); unset($string_arr[$c-1]); echo implode(" ", $string_arr); ?> такой забавный вариант, но вроде работает
VItalijs, спасибо) правда я сам уже сделал, но там неочень вариант. а можно коментарии к 5 и 6 строчки, а то что-то я немогу чуть понять...
VItalijs, PHP: <? $string = "а что, если в первой строке будут слова_с_подчеркиваниями? <br> some other text<div>third part of text</div>"; // Скорее так как то $string_arr = preg_split('/\<(br|p|div)\>/', $string)
PHP: <? $string_arr = preg_replace("/\s+/", " ", trim($string_arr[0])); ?> в эту регулярку можно засунуть любые разделители какие хотите. PHP: <? $string_arr = preg_split('/\<(br|p|div)\>/', $string) ?> не люблю регулярки, да и работают они медленнее вроде как.
я говорю про достаточно глупый подход str_replace(array("<br>", "<p>", "<div>"), "#_#", $string); Хотя да, я ошибся, ты бъешь не по _, а по #_#, но мало ли, вдруг ктото смайл такой поставит. Смотри. То, что ты делаешь тремя операциями замены и одной - поиска и разбивания строки, я делаю одним поиском по регулярному выражению. Как-то на этом форуме я уже сказал что-то типа: "Когда можно отказатся от тяжелой регулярки - от нее стоит отказатся". Так вот - иногда лучше сделать регуляркой.
TheShock ну смайл не поставят - это точно) обьясни пожалуйста раздницу, а то состроками я почти неработал
Ну смотри. Вот как бы ты искал, заканчивается ли данная строка на определенную подстроку? Строковыми функциями получил бы длину подстроки, последний индекс ее вхождения и приравнял бы сумму этих параметров ко всей длине строки? А я бы сделал чтото типа такого: PHP: <?php $endsWith = 'here'; // False $endsWith = 'string'; // True var_dump(!!preg_match("/$endsWith&/", "Here is our test string")); ?> Это к тому, что иногда регулярные выражения лучше (и даже быстрее, если проверить ), чем строковые. А теперь смотри пример выше. Допустим, ты действительно не будешь использовать в тексте #_#. Но. Ты трижды проходишь по строке и заменяешь возможные значения на этот псевдоэлемент. А что, если правила поиска станут тяжелее? Например, надо будет не <div|p>, а <div|p class='{а тут - 10 возможных значений}'>, например, если автор захочет покрасить каждый параграф как зебру тремя цветами, и т.п. Так у тебя распухнет это выражение, что ужос. А я сделаю так: PHP: <? $string_arr = preg_split('/\<\/?(br|p|div)(.*?)\>/', $string) ?> В принципе, это учтет практически все возможные варианты, даже те, о которых я пока не знаю. Согласен с моей логикой? Скажу так - не стоит боятся регексов. Ты врядли сможешь написать быстрее без их использования что-то кроме примитивной логики. Всему нужен свой подход. Иногда - РегВыр, иногда - Строковые функции, иногда - чтото другое.
TheShock Согласен, у тя более оптимизированный метод, для тежелых текстов пойдет. но в моем случае надо то что пошустрее, так как условия заранее известны, зебр паласатых точно не будет) я вообще использую следующие PHP: //Статья может начинаться с Заголовка, и точно уже известно чем заканчивается $content = "<h3>HEADER 3</h3><div>NURA IS THE BEST GAME</div>IN THE WORLD"; $a = strpos($content, "</div>"); $b = substr($content, 0, $a+6);
думал над этим - неподходит. редактировать будет отдельный человек, который неразбирается в этом, может и забыть
на это я и расчитываю... а вот твой вариант - точто надо, когда буду писать модули для сайта с большим количеством редакторов... вот там вот точно нельзя будет уследить за стилем
Знаешь, один мой друг, когда я допустил возможность коллизии в миллиардную долю процента сказал: "Ничего себе, а я думал, что ты - перфекционист". После этого я увеличил длину хеша вдвое. На что он сказал: "Все-равно как-то ты слабо в этот раз". Так вот - стоит учесть ВСЕ варианты. Что я тебе рекомендую делать изначально