Как добавить циклы в несложный код

Тема в разделе "Как сделать...", создана пользователем bork75, 12 янв 2014.

  1. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Нахожу в искомом тексте слова в скобках и перевожу их в urlencode.
    Код рабочий сделал, но в тексте будет много искомых [[слов]],
    нужно как-то циклом учесть все переменные.
    в последнем, где $replacements[0] порядок перекручен

    Начальный текст: текст [[слово1]] текст [[слово2]] текст [[слово3]] и тд....
    Текст на выходе: текст %F1%EB%EE%E2%EE1 текст %F1%EB%EE%E2%EE2 текст %F1%EB%EE%E2%EE3

    PHP:
    <?php
    $string 
    "текст [[слово1]] текст [[слово2]] текст  [[слово3]]";

    // Находим слова с скобках [[ ]]
    $pattern "/\[\[(.*?)\]\]/i";

    preg_match_all ($pattern$string$slovoPREG_PATTERN_ORDER);

    $text0 $slovo[1][0];
    $text1 $slovo[1][1];
    $text2 $slovo[1][2];

    // Учитываем слово со скобками для str_replace
    $patterns[0] = "[[".$text0."]]";
    $patterns[1] = "[[".$text1."]]";
    $patterns[2] = "[[".$text2."]]";

    // Перводим найденные слова в urlencode

    $replacements[2] = urlencode($text0); //! 2
    $replacements[1] = urlencode($text1); //! 1
    $replacements[0] = urlencode($text2); //! 0


    // Делаем замену найденных слов на слова в urlencode
    echo str_replace($patterns$replacements$string);
    ?>
     
  2. krdma

    krdma Постоялец

    Регистр.:
    1 июн 2009
    Сообщения:
    89
    Симпатии:
    15
    немного кривое решение, есть замечательная функция, http://php.net/strtr, пройдись через foreach по массиву полученному после регулярки, забей массив слово => преобразованное слово и скорми это дело функции.
     
    bork75 нравится это.
  3. TeamArea

    TeamArea Писатель

    Регистр.:
    10 янв 2014
    Сообщения:
    1
    Симпатии:
    0
    Используй функцию preg_replace или (если более сложные преобразования) preg_replace_callback
     
  4. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Функция интересная, но прикрутить её не получилось.
    Если не сложно, покажи на моём примере.
     
  5. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Для cp1251:
    Код:
    <?php
    
    $q = 'текст [[слово1]] текст [[слово2]] текст [[слово3]]';
    $m = preg_replace_callback('#\[\[(.*)\]\]#iU','urlencode_0',$q);
    echo $q,'<br>',$m,'<br>',$q;
    function urlencode_0($matches) {
        print_r ($matches);
        return urlencode($matches[0]);
    }
    
    Если будет utf-8 - в регулярку добавить u:
    Код:
    '#\[\[(.*)\]\]#iuU'
     
    bork75 нравится это.
  6. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Отлично, это то, что нужно! )
    Только на выходе кодировка не та, хотя по коду всё правильно

    слово1 должно быть на выходе %F1%EB%EE%E2%EE1
    Сейчас так %5B%5B%F1%EB%EE%E2%EE1%5D%5D

    iuU попробовал
     
  7. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Это скобки [[]]
    Исправьте в исходном коде
    на
    Код:
        return urlencode($matches[1]);
    
     
    bork75 нравится это.