помогите с регуляркой

Тема в разделе "Регулярные выражения", создана пользователем Juri, 30 ноя 2010.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    Здравствуйте, второй день ломаю голову над такой задачей.
    Есть кусок текста с html кодом.

    Например:

    HTML:
    <div align="center"><!--dle_image_begin:http://dle.ru1/uploads/boxsmall.jpg|--><img src="http://dle.ru1/uploads/boxsmall.jpg" alt="Добро пожаловать" title="Добро пожаловать"  /><!--dle_image_end--></div>Добро пожаловать на демонстрационную страницу движка DataLife Engine.
    в нем нужно слово Добро сделать ссылкой на нужную страницу, как это можно сделать? Естественно в title, alt к картинке оно меняться не должно.
    Помогите, заранее спасибо
     
  2. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    PHP:
    $text preg_replace('#(?<=</div>)(.*?)(Добро)#','$1<a href="">$2</a>',$text);
    также вместо 'Добро' можно подставить любое слово после '</div>'
     
    Juri нравится это.
  3. Phrack

    Phrack

    Регистр.:
    3 ноя 2010
    Сообщения:
    264
    Симпатии:
    38
    решается и без регулярок, что даже лучше (
    )

    PHP:
    str_replace('</div>Добро''</div><a href="#">Добро</a>','<div align="center"><!--dle_image_begin:http://dle.ru1/uploads/boxsmall.jpg|--><img src="http://dle.ru1/uploads/boxsmall.jpg" alt="Добро пожаловать" title="Добро пожаловать"  /><!--dle_image_end--></div>Добро пожаловать на демонстрационную страницу движка DataLife Engine.');
     
  4. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    Все бы хорошо, но если слово идет просто посреди текста то замены уже не происходит. Если бы помогли еще это поправить было бы вообще супер
     
  5. motzmo

    motzmo Создатель

    Регистр.:
    20 июн 2007
    Сообщения:
    43
    Симпатии:
    16
    попробуйте функцию strripos() - ищет последнее совпадение строки в строке, возвращает позицию последнего совпадения. Можно заменить substr_replace или ещё чем либо
     
  6. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    Вот абы написать, проблема именно в регулярке, сам не могу допетрить как поправить...
     
  7. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    для случая с переносами строк после </div>: модификатор 's'

    PHP:
    $text preg_replace('#(?<=</div>)(.*?)(Добро)#s','$1<a href="">$2</a>',$text);
     
    Juri нравится это.
  8. motzmo

    motzmo Создатель

    Регистр.:
    20 июн 2007
    Сообщения:
    43
    Симпатии:
    16
    нашёл очевидное решение проблемы, взять начало и конец до слова "добро", заменить добро на что нужно и потом склеить 3 части.
    модификатор /D в регулярке берёт последнее совпадение в строке.
    PHP:
    <?
    $stroka '<div align="center"><!--dle_image_begin:http://dle.ru1/uploads/boxsmall.jpg|--><img src="http://dle.ru1/uploads/boxsmall.jpg" alt="Добро пожаловать" title="Добро пожаловать"  /><!--dle_image_end--></div>Добро пожаловать на демонстрационную страницу движка DataLife Engine.';
    preg_match_all("/(.*)(Добро)(.*)$/D"$stroka $parts);
    $zamena '<a href="http://link/">' $parts[2][0] . '</a>';
    $complete $parts[1][0] . $zamena $parts[3][0];
    echo 
    $complete;
    ?>
    вывод: <div align="center"><!--dle_image_begin:http://dle.ru1/uploads/boxsmall.jpg|--><img src="http://dle.ru1/uploads/boxsmall.jpg" alt="Добро пожаловать" title="Добро пожаловать"  /><!--dle_image_end--></div><a href="http://link/">Добро</a> пожаловать на демонстрационную страницу движка DataLife Engine.
     
  9. Phrack

    Phrack

    Регистр.:
    3 ноя 2010
    Сообщения:
    264
    Симпатии:
    38
    удаление гланд через кхм...посмотрите мое решение на несколько постов выше. оно рабочее, пока не доказано обратное:-]
     
  10. Juri

    Juri

    Заблокирован
    Регистр.:
    5 окт 2007
    Сообщения:
    1.068
    Симпатии:
    197
    Оказалось правильным решением. Пока работает, посмотрим.
     
Статус темы:
Закрыта.