За последние 24 часа нас посетил 17671 программист и 1723 робота. Сейчас ищут 878 программистов ...

Как выделить слова в тексте?

Тема в разделе "PHP для новичков", создана пользователем Tures, 14 июл 2013.

  1. Tures

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

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    В общем есть массив:
    Код (Text):
    1. Array ( [0] => like [1] => web )
    И функция, которая выделяет слова в тексте:
    Код (Text):
    1. str_ireplace("word", "<b>word</b>", $po['post'])
    Меня интересует, как сделать, чтобы эта функция перебирала все слова из этого массива и делала каждое слово жирным?
    Например, чтобы в тексте было <b>like</b> <b>web</b>.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сделай второй массив с заменами и подставь оба массива в функцию, она поймет.

    еще лучше, сделать ключами слова, а значениями - то на что менять, и array_keys() поможет
     
  3. Tures

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

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    у меня тоже такая мысль была, только не знаю, как заменить данные в массиве, ведь в примере я дал только 2 определенных значения, а так их может быть больше и с совсем другими значениями.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Код (Text):
    1. Array ( 'like' => '<b>like</b>', 'web'=>'<b>web</b>' );
    2. str_replace(array_keys($array), $array, $po['post']);
     
  5. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Вам нужен индексированный массив, только и всей разницы с примером выше.

    $dict = array('world', 'wide', 'web'); // и так далее.

    Затем то же самое

    foreach($dict as $word) {
    str_ireplace(" $word ", " <b>$word</b> ", $po['post'])
    }

    На самом деле геморроя больше чем кажется. Как вы хотите заменить слово целиком? Можно как в примере - добавив пробелы. А если им кончается предложение и вместо пробела идет точка. Кстати, парадигму слова как планируете отслеживать? Скажем надо выделить "яблоко", а "яблоки", "яблок", "яблоками" и тп?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто заменить слово целиком

    какая разница? слово есть слово =)

    такая задача не озвучивалась.

    зачем использовать цикл, когда можно вызвать функцию всего один раз?
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    foreach($dict as $word) {
    echo str_ireplace(" $word ", " <b>$word</b> ", $po['post'])
    }

    :D 3 раза в жопу
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Если, что-то серьезное то без регулярки не обойтись.
     
  9. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Ник ТС - это один из ваших ников, или вы-то тут при чем в бочке затычка?

    Бред какой-то, приходится объяснять элементарное. В любом текстовом редакторе есть поиск/замена и там есть опция - целиком. Если не целиком то вхождением будет не слово, а последовательность.

    При чем тут функция какая-то, я не понял. Другого способа как умножить состав словаря на состав текста в природе не существует. Ну оберните священный форич в функцию - будет вам функция.

    Добавлено спустя 2 минуты 27 секунд:
    И как по-вашему процедурно устроен парсер регулярок? Трансцендентально, или с форич-форнекстами?
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ууу как все запущено)
    что именно непонятно то? что лучше вызвать функцию один раз, чем её же 10 раз?

    Добавлено спустя 2 минуты 13 секунд:
    если вы наивно думаете, что там для поиска каждой подгруппы вся строка сканируется ЗАНОВО - то вы ошибаетесь!
    учить матчасть - единственное что могу посоветовать)
     
  11. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Это вы наивно думаете будто есть другие способы кроме перебора. Вопрос как этот перебор оптимизировать не обсуждался. ТС встрял на священных массивах с ключами и запутался. Отвечанты запутали его еще больше поддержав эту идею. Я попытался объяснить что для простых задач делается обычный индексированный массив - в точности как вообще делается любой словарь и даже специально обозвал переменную $dict[ionary].

    Если до вас не доходит что именно таким макаром индексируются базы данных и вообще все что угодно - учите матьчасть, или папчасть - на выбор.

    Добавлено спустя 10 минут 9 секунд:
    Про функцию все молчат как рыба об лед. Подразумевается regexp что ли? То есть взять из БД несколько сотен слов и загнать их в паттерн парадигмы каждого? Интересно было бы посмотреть на эту "функцию".

    Это уже совсем другая история. Человеку надо уехать на две остановки, а вы ему атомную подлодку пытаетесь продать.
     
  12. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    deblogger, ты хоть проверял свой код?
    igordata предложил рабочий вариант. Ты предложил говнокод и теперь зачем-то споришь.
    Вот это написано тебе, как к умному, т.к. от тебя выходят сложные предложения. Но, похоже, ты не осилил.
     
  13. Tures

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

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Спасибо всем! Решил заменой данных в массивах.
    Знаю, говнокод, но работает.
    Код (Text):
    1.  
    2.         $klm = array();
    3.         $newArr = explode(' ', $query);
    4.         foreach($newArr as $lm){
    5.             $kl[] = $lm;
    6.             $klm[] = $lm;
    7.         }
    8.         unset($lm, $kl);
    9.        
    10.         $ppl = array();
    11.         foreach($newArr as $lm){
    12.             $kl[] = "<b>".$lm."</b>";
    13.             $ppl[] = "<b>".$lm."</b>";
    14.         }
    15.         unset($lm, $kl);
    16.        
    17.         echo str_ireplace($klm, $ppl, $po['post']);
    18.         unset($klm, $ppl);
     
  14. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Не слушайте шакалов. PHP обрелся благодаря быстродействию ядра и захреначить 1000 case в switch эффективнее всяких шмункций.

    Кроме того работа с текстом это самое легкое что можно поручить компу в человеко-читаемом коде. Скажем чтобы уменьшить 10мегабитную картинку на 10% процессор потратит ресурсов которых бы хватило выделить все слова "пролетариат" в полном собрании сочинения ленина стопицот раз.
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    no comments
     
  16. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    ОМГ...
     
  17. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Вот именно. Чтобы подготовиться к услугам одной функции, надо как следует подготовиться. Сходить в баню, сделать очистительную клизму, одеть белые тапочки и можно откидываться.

    Им говорят природу не нае,,,,шь, они все равно верят что нае....шь.
     
  18. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    deblogger, тут люди (не все, но) программируют на разных языках уже много лет, агрессивный мальчик. Твоя философия от пупа может только иногда развеселить.
    Tures, для надежности разделения на слова я бы взял какую-нибудь функцию вроде str_word_count($inp,2). Но, возможно, есть более оптимальные варианты. Вообще даже интересно стало.


    Можно ещё и так для каждого искомого слова
    Код (PHP):
    1. $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.";
    2. $out=preg_replace('/(\b)like(\b)/i','$1<b>like</b>$2',$inp); 
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты читай доки-то.

    Добавлено спустя 2 минуты 12 секунд:
    он не знает, что она жрёт массивы походу.

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    о php идет речь
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    братиша, ты маляш вчитайся в код-то

    Код (PHP):
    1.       $newArr = explode(' ', $query);
    2.       
    3.       $ppl = array();
    4.       foreach($newArr as $lm){
    5.          $ppl[] = "<b>".$lm."</b>";
    6.       }
    7.       
    8.       echo str_ireplace($newArr, $ppl, $po['post']);
    вот так норм
     
  22. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    А я на этом остановился:
    Код (PHP):
    1. $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 ';
    2. $words=array("like","web");
    3. foreach($words as $word){
    4.     $inp=preg_replace("/(\b)$word(\b)/i","$1<b>$word</b>$2",$inp);
    5. }
    6. echo $inp;
    Адекватно жирнит отдельные слова. Плюс любимая функция foreach.
     
  23. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    deblogger, если существует функция "php", она будет быстрее обрабатываться.
    Даже "пользовательские функции", если правильно создать будет эффективнее.
    То есть если мне потребуется еще "2566", я буду еще столько делать проверок?

    Проще нагородить "велосипед", у всех "велик", свой, даже спорить не буду, но не да такой же степени :D

    "Java"- также знаете? ;)