В общем есть массив: Код (Text): Array ( [0] => like [1] => web ) И функция, которая выделяет слова в тексте: Код (Text): str_ireplace("word", "<b>word</b>", $po['post']) Меня интересует, как сделать, чтобы эта функция перебирала все слова из этого массива и делала каждое слово жирным? Например, чтобы в тексте было <b>like</b> <b>web</b>.
сделай второй массив с заменами и подставь оба массива в функцию, она поймет. еще лучше, сделать ключами слова, а значениями - то на что менять, и array_keys() поможет
у меня тоже такая мысль была, только не знаю, как заменить данные в массиве, ведь в примере я дал только 2 определенных значения, а так их может быть больше и с совсем другими значениями.
Код (Text): Array ( 'like' => '<b>like</b>', 'web'=>'<b>web</b>' ); str_replace(array_keys($array), $array, $po['post']);
Вам нужен индексированный массив, только и всей разницы с примером выше. $dict = array('world', 'wide', 'web'); // и так далее. Затем то же самое foreach($dict as $word) { str_ireplace(" $word ", " <b>$word</b> ", $po['post']) } На самом деле геморроя больше чем кажется. Как вы хотите заменить слово целиком? Можно как в примере - добавив пробелы. А если им кончается предложение и вместо пробела идет точка. Кстати, парадигму слова как планируете отслеживать? Скажем надо выделить "яблоко", а "яблоки", "яблок", "яблоками" и тп?
просто заменить слово целиком какая разница? слово есть слово =) такая задача не озвучивалась. зачем использовать цикл, когда можно вызвать функцию всего один раз?
foreach($dict as $word) { echo str_ireplace(" $word ", " <b>$word</b> ", $po['post']) } 3 раза в жопу
Ник ТС - это один из ваших ников, или вы-то тут при чем в бочке затычка? Бред какой-то, приходится объяснять элементарное. В любом текстовом редакторе есть поиск/замена и там есть опция - целиком. Если не целиком то вхождением будет не слово, а последовательность. При чем тут функция какая-то, я не понял. Другого способа как умножить состав словаря на состав текста в природе не существует. Ну оберните священный форич в функцию - будет вам функция. Добавлено спустя 2 минуты 27 секунд: И как по-вашему процедурно устроен парсер регулярок? Трансцендентально, или с форич-форнекстами?
ууу как все запущено) что именно непонятно то? что лучше вызвать функцию один раз, чем её же 10 раз? Добавлено спустя 2 минуты 13 секунд: если вы наивно думаете, что там для поиска каждой подгруппы вся строка сканируется ЗАНОВО - то вы ошибаетесь! учить матчасть - единственное что могу посоветовать)
Это вы наивно думаете будто есть другие способы кроме перебора. Вопрос как этот перебор оптимизировать не обсуждался. ТС встрял на священных массивах с ключами и запутался. Отвечанты запутали его еще больше поддержав эту идею. Я попытался объяснить что для простых задач делается обычный индексированный массив - в точности как вообще делается любой словарь и даже специально обозвал переменную $dict[ionary]. Если до вас не доходит что именно таким макаром индексируются базы данных и вообще все что угодно - учите матьчасть, или папчасть - на выбор. Добавлено спустя 10 минут 9 секунд: Про функцию все молчат как рыба об лед. Подразумевается regexp что ли? То есть взять из БД несколько сотен слов и загнать их в паттерн парадигмы каждого? Интересно было бы посмотреть на эту "функцию". Это уже совсем другая история. Человеку надо уехать на две остановки, а вы ему атомную подлодку пытаетесь продать.
deblogger, ты хоть проверял свой код? igordata предложил рабочий вариант. Ты предложил говнокод и теперь зачем-то споришь. Вот это написано тебе, как к умному, т.к. от тебя выходят сложные предложения. Но, похоже, ты не осилил.
Спасибо всем! Решил заменой данных в массивах. Знаю, говнокод, но работает. Код (Text): $klm = array(); $newArr = explode(' ', $query); foreach($newArr as $lm){ $kl[] = $lm; $klm[] = $lm; } unset($lm, $kl); $ppl = array(); foreach($newArr as $lm){ $kl[] = "<b>".$lm."</b>"; $ppl[] = "<b>".$lm."</b>"; } unset($lm, $kl); echo str_ireplace($klm, $ppl, $po['post']); unset($klm, $ppl);
Не слушайте шакалов. PHP обрелся благодаря быстродействию ядра и захреначить 1000 case в switch эффективнее всяких шмункций. Кроме того работа с текстом это самое легкое что можно поручить компу в человеко-читаемом коде. Скажем чтобы уменьшить 10мегабитную картинку на 10% процессор потратит ресурсов которых бы хватило выделить все слова "пролетариат" в полном собрании сочинения ленина стопицот раз.
Вот именно. Чтобы подготовиться к услугам одной функции, надо как следует подготовиться. Сходить в баню, сделать очистительную клизму, одеть белые тапочки и можно откидываться. Им говорят природу не нае,,,,шь, они все равно верят что нае....шь.
deblogger, тут люди (не все, но) программируют на разных языках уже много лет, агрессивный мальчик. Твоя философия от пупа может только иногда развеселить. Tures, для надежности разделения на слова я бы взял какую-нибудь функцию вроде str_word_count($inp,2). Но, возможно, есть более оптимальные варианты. Вообще даже интересно стало. Можно ещё и так для каждого искомого слова Код (PHP): $inp = "Loremlikeipsum like dolor like sit amet like, web rheni sedes web collocavit web at eius est amet Cur meae ad per. Apolloni figitur acquievit sed dominum in fuerat construeret cena, venis potest contremiscunt eum in rei finibus veteres hoc. Nutricem sum ad suis caelo dicit semper incommunicabile in lucem genero ergo est Apollonius."; $out=preg_replace('/(\b)like(\b)/i','$1<b>like</b>$2',$inp);
ты читай доки-то. Добавлено спустя 2 минуты 12 секунд: он не знает, что она жрёт массивы походу. пхп скриптовый язык. он медленнее своих нативных функций скомпиленных. функция замены может принимать массивы на оба аргумента что на что менять. и работает соотв. быстрее форыча. почему бы не использовать это преимущество.
братиша, ты маляш вчитайся в код-то Код (PHP): $newArr = explode(' ', $query); $ppl = array(); foreach($newArr as $lm){ $ppl[] = "<b>".$lm."</b>"; } echo str_ireplace($newArr, $ppl, $po['post']); вот так норм
А я на этом остановился: Код (PHP): $inp='Loremlikeipsum like dolor Like sit amet like, Web rheni sedes web like collocavit web at eius est amet Cur likemeaelike like ad per.like '; $words=array("like","web"); foreach($words as $word){ $inp=preg_replace("/(\b)$word(\b)/i","$1<b>$word</b>$2",$inp); } echo $inp; Адекватно жирнит отдельные слова. Плюс любимая функция foreach.
deblogger, если существует функция "php", она будет быстрее обрабатываться. Даже "пользовательские функции", если правильно создать будет эффективнее. То есть если мне потребуется еще "2566", я буду еще столько делать проверок? Проще нагородить "велосипед", у всех "велик", свой, даже спорить не буду, но не да такой же степени "Java"- также знаете?