За последние 24 часа нас посетили 18042 программиста и 1590 роботов. Сейчас ищут 1152 программиста ...

Помогите написать регулярное выражение

Тема в разделе "Регулярные выражения", создана пользователем miha25, 10 фев 2013.

  1. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    Здравствуйте!

    Подскажите, есть текст:

    Код (Text):
    1. $text = "Яркий чехол для iPhone 4/4S из силикона будет долго и надежно защищать Ваш смартфон от ударов, царапин, потертостей, пыли и остальных внешних факторов. Формы чехла в точности совпадают с габаритами iPhone 4/4s.
    2. Характеристики: яркий, оригинальный чехол, удобно лежит в руке, есть все необходимые вырезы под боковые кнопки, гарнитуру, камеру, не скользит, плотно прилегает к телефону, легко одевается и снимается";
    есть слова:

    Код (Text):
    1. $tags = "iPhone,оригинальный,гарнитуру,телефону,снимается";
    Вопрос:

    как слова с переменной $tags заменить найти в тексте и заменить на ссылки в виде:

    Код (Text):
    1. <a href="http://site.ru/tags/iPhone/">iPhone</a>
    2. <a href="http://site.ru/tags/оригинальный/">оригинальный</a>
    3. <a href="http://site.ru/tags/гарнитуру/">гарнитуру</a>
    4. <a href="http://site.ru/tags/телефону/">телефону</a>
    5. <a href="http://site.ru/tags/снимается/">снимается</a>
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    одной строкой - preg_replace
    многими строками - explode + цикл конкатенаций
     
  3. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    К сожалению я не силен ни в первом случае ни во втором, если не трудно напишите пожалуйста регулярное выражение которое будет делать такую замену
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Код (PHP):
    1. <?php
    2.  
    3. $text = "Яркий чехол для iPhone 4/4S из силикона будет долго и надежно защищать Ваш смартфон от ударов, царапин, потертостей, пыли и остальных внешних факторов. Формы чехла в точности совпадают с габаритами iPhone 4/4s.
    4. Характеристики: яркий, оригинальный чехол, удобно лежит в руке, есть все необходимые вырезы под боковые кнопки, гарнитуру, камеру, не скользит, плотно прилегает к телефону, легко одевается и снимается";
    5.  
    6.  
    7. $tags = "iPhone,оригинальный,гарнитуру,телефону,снимается";
    8.  
    9. $data = explode(',', $tags);
    10.  
    11. $patterns = array("/{$data[0]}/", "/{$data[1]}/", "/{$data[2]}/", "/{$data[3]}/", "/{$data[4]}/") ;
    12. $replacements = array('[url="http://site.ru/tags/iPhone/"]iPhone[/url]',
    13.             '[url="http://site.ru/tags/оригинальный/"]оригинальный[/url]',
    14.             '[url="http://site.ru/tags/гарнитуру/"]гарнитуру[/url]',
    15.             '[url="http://site.ru/tags/телефону/"]телефону[/url]',
    16.             '[url="http://site.ru/tags/снимается/"]снимается[/url]');
    17.  
    18. $result = preg_replace($patterns, $replacements, $text);
    19.  
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    уууу......

    $result = preg_replace("#(".str_replace(',', '|', $tags).")#i", '<a href="http://site.ru/tags/$1/">$1</a>', $text);
     
  6. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    smitt, спасибо
    Ganzal, спасибо ваш вариант поставил, то что надо
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в варианте smitt'а при изменении списка тегов или адресов - нужно будет и реплейсменты менять и следить за кол-вом элементов и все такое. мой просто заменяет все запятые в списке тегов на пайпы, что дает реплейсу шаблон "или", а замена происходит подстановкой найденного слова в ссылку и ее текст. в одной строке контролируем теги, в другой строке - шаблон замены.
    удачи.
     
  8. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    а как можно остановить скрипт, допустим менять на ссылки не 5 слов, а только 3?

    Добавлено спустя 2 минуты 16 секунд:
    $arr=explode(", ",$str);
    //берем первые 4 запятые
    $arr=array_slice($arr,0,4);
    //превращаем в строку
    $imagemetakeyimages=implode(", ",$arr);

    подставил этот скрипт до и получилось регулировать кол-во, спасибо всем

    Добавлено спустя 11 минут 59 секунд:
    извините, все равно, если допустим в тексте два слова "ремонт", то оба заменяются на ссылки, как можно сделать чтобы замена происходила только одного слова?
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы совсем новичок, да?
     
  10. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    Да, учусь
     
  11. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    тогда разделом ошиблись. ну да ладно, оставим как есть. мануал-то научились читать?
     
  12. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    пробую preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] ) добавить лимит 3, вроде теперь меняет только 3 слова, но опять же если встречается два раза слово допустим ремонт, то меняет оба, и еще заметил что в ссылке есть пробел <a href="http://site.ru/tags/?ремонт/">ремонт</a> отметил его знаком вопроса, помогите плиз
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    регулярочки всем возрастам покорны
     
  14. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    недостаточно просто знать инструмент, нужно уметь его применять. с этим у вас проблема.
    первоначальная задача решалась, напомню, минимум двумя способами - одной строкой с preg_replace (успешно) или несколькими строками с explode. и тут у вас возникает затык, потому что вы не понимаете как можно совмещать инструменты. то есть писать программу, алгоритм.
    Код (Text):
    1. $tmp = explode(',', $tags);
    2. foreach( $tmp as $tag )
    3. {
    4.     $text = preg_replace("#(".$tag.")#i", '<a href="http://site.ru/tags/$1/">$1</a>', $text, 1);
    5. }
    в следующий раз прошу обозначать уровень своих знаний соответствующим форумом.

    PS. про пробел понял ничего.
     
  15. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    хорошо, следующий раз буду писать в раздел новички, сделал как вы написали, вроде все получилось, ну вот вылезла еще одна проблема, теперь если есть слово ремонтируем, то пол слова РЕМОНтируем заменяет на ссылку, а остальная часть слова неактивна, как это можно исправить?
     
  16. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    можете пока ответить на вопрос почему так происходит?
     
  17. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    я конечно понимаю что скрипт ищет определенную часть слова и заменяет его на ссылку, но сделать так чтобы заменяло целое слово а не его часть (например: ремонтируем), или вообще его не затрагивало не понимаю, сдаюсь
     
  18. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а почему вы выбрали именно регулярное выражение? вы решили сделать сразу круто не имея базиса.
    не слова оно ищет, а последовательность символов согласно шаблону.
     
  19. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    ответ прост, выбрал потому что не понимаю в этом ничего, поможете сделать?
     
  20. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    для меня это неправильный ответ. так халявщики обычно говорят. правильный ответ: я стремлюсь использовать правильные инструменты для решения своих задач, однако у меня мало опыта самостоятельного освоения материала.
    Код (Text):
    1. $text = preg_replace("#\b({$tag})\b#iu", '<a href="http://site.ru/tags/$1/">$1</a>', $text, 1);
    удачи.

    ЗЫ. обычно человек, который стремиться что-то сделать и чему-то научится - выкладывает свои наработки, описывает свою логику и возникшую проблему. таким сложно отказать в помощи. конечно, если человек за пол года так ничему и не научился - его запросы будут вызывать диарею и тоску по бесцельно потраченному времени. не хочешь учиться - не надо, другие новички ждут внимания, и может быть от них отдачи больше будет.
    а вот за такое "как сделать? ок, а теперь нужно вот так! а теперь у меня такая проблема" - обычно деньги платят.
     
  21. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    я пытаюсь разобраться но у меня пока плохо получается поэтому просил помощи здесь, а халявщиком я никогда не был и не буду, если бы вы сразу сказали что дело заключается в деньгах, я бы заплатил, скиньте кошелек в ЛС, скажите сколько я заплачу
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да не в деньгах дело, вы не поняли. я с радостью помогаю людям, которые пытаются разобраться. лучшая благодарность - если вы поймете материал. но бывают случаи, когда человеку не нужно тратить время на изучения материала, а нужен конкретный результат - тогда это заказывается за деньги.
     
  23. miha25

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

    С нами с:
    27 сен 2011
    Сообщения:
    39
    Симпатии:
    0
    сделал так:

    Код (Text):
    1. $text = "Яркий чехол для iPhone 4/4S из силикона будет долго и надежно защищать Ваш смартфон от ударов, царапин, потертостей, пыли и остальных внешних факторов. Формы чехла в точности совпадают с габаритами iPhone 4/4s.
    2. Характеристики: яркий, оригинальный чехол, удобно лежит в руке, есть все необходимые вырезы под боковые кнопки, гарнитуру, камеру, не скользит, плотно прилегает к телефону, легко одевается и снимается, ремонтируем телефоны";
    3.  
    4.  
    5. $tags = "iPhone,оригинальный,гарнитуру,телефону,снимается,ремонт";
    6.  
    7. $tmp = explode(',', $tags);
    8. foreach( $tmp as $tag )
    9. {
    10.  
    11.    
    12.     $text = preg_replace("#\b({$tag})\b#iu", '<a href="http://site.ru/tags/$1/">$1</a>', $text, 1);
    13. }
    14. echo $text;
    теперь вообще заменяет только слово iPhone
     
  24. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Если параметров для замены не много не вижу ничего страшного...
    Я показал простой пример в котором разберется даже новичек, писать все в 1 строку... тут же не конкурс кто напишет короче :)

    Радует твой оптимизм, молодец, так держать!
     
  25. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    кодировка какая? флаг u добавлен из соображений юникода.