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

Discussion in 'PHP' started by L007, 14 Dec 2012.

  1. L007

    L007 New Member

    Joined:
    30 Nov 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Есть входящий текст, в котором нужно заменить некоторые слова на ссылки. Перечень слов берется из базы данных, в которой хранится ссылка и анкор для замены.

    Споткнулся вот на чем, например если такой список замены:
    1. F-2
    2. виза F-2
    3. американская виза F-2

    При такой варианте слов в тексте будет произведено аж 3 замены. Помогите составить регулярку чтобы меняло только 1 раз в зависимости от того какое слово встретит первым.
     
  2. Skofield

    Skofield Elder - Старейшина

    Joined:
    27 Aug 2008
    Messages:
    945
    Likes Received:
    307
    Reputations:
    51
    В функции preg_replace можно указать четвертым параметром(limit) сколько вхождений должно быть заменено, то есть так:
    PHP:
    echo preg_replace('~string to find~''string to replace'$str1);
     
  3. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    тут регулярками не обойтись, кмк. Тебе надо сначала разобраться со своими сущностями. Быстрым решением видится выборка из базы ORDER BY STRLEN(string) DESC
    Таким образом мы меняем сначала длинные слова, потом короткие.
    Чтобы в уже поменяных ссылках не подставлялись снова ссылки (ваша проблема), меняем по регулярке
    Code:
    (F-2)(?!.*(?:<\/a>)|(".*>))
    И будет нам счастье.
    Кстате, рекомендую всем поставить тестилки регулярок прямо в браузер.
    Для FF — https://addons.mozilla.org/ru/firefox/addon/rext/?src=search (в фаере давно не сидел, возможно появилось что-то лучше)
    Для Chrome — https://chrome.google.com/webstore/detail/regexp-tester-app/cmmblmkfaijaadfjapjddbeaoffeccib?hl=ru
     
    _________________________
  4. L007

    L007 New Member

    Joined:
    30 Nov 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Почему-то не во все нужных словах производится замена. Делаю так:

    PHP:
    $sql="select * from links order by words desc";
        
    $res=db_select($sql);
        while(
    $row=mysql_fetch_array($res))
            {
                
    $link[].=    $row['link'];
                
    $ankor[].=    $row['ankor'];
            }
        
        for(
    $i=0$i<=count($link)-1$i++)
            {
                
    $text preg_replace('#('.$ankor[$i].')(?!.*(?:<\/a>)|(".*>))#i''<a href=\"'.$link[$i].'\">'.$ankor[$i].'</a>'$text);
            }
    Входящий текст:
    Текст после замены:
    В этом текст почему-то не поменяла еще одну фразу: "визу M-2"
     
  5. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    А выведи все слова из базы? у меня по твоему тексту и по твоим словам
    Code:
    ((визу M-2)|(визе F-2)|(визы M-1))(?!.*(?:<\/a>)|(".*>))
    регулярка видит все вхождения.
     
    _________________________
  6. L007

    L007 New Member

    Joined:
    30 Nov 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    у меня для замены около 400 слов и фраз.
    Не ляжит ли сервер при :
    ((визу M-1)|...400...|(визы M-N))(?!.*(?:<\/a>)|(".*>))
     
Loading...