За последние 24 часа нас посетил 22801 программист и 1262 робота. Сейчас ищут 734 программиста ...

Регулярка для перелинковки между статьями

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

  1. mazahaler

    mazahaler Новичок

    С нами с:
    2 ноя 2017
    Сообщения:
    66
    Симпатии:
    2
    Здравствуйте, нужна помощь с перелинковкой.
    Сейчас она у меня работает по принципу: если определенное слово(хранящееся в бд) есть в тексте, то оно оборачивается в ссылку на другую статью.
    Проблема вот в чем: ссылка формируется даже в том случае, если "оперделенное слово" содержится в другом слове (пример: "определенное слово" - чай, слово чрезвычайно на половину преобразовывается в ссылку).
    А мне надо, чтобы слова преобразовывались в ссылку, только если они начинаются с "определенного слова" - чайный и т.п.
    Надеюсь понятно объяснил.
    Вот мой код:
    PHP:
    1.                              
    2. foreach($keyword_links as $link){
    3.   if($link->id_news!=$new->id){
    4.    $arr[$link->keyword] = "../" . $link->link;
    5.   }
    6. }
    7.                              
    8. $str = $new->description;
    9.   foreach ($arr as $k => $v) {
    10.       $str = preg_replace("/(".$k.".*?)\b/iu", "<a href='".$v."'>\\1</a>", $str, 1);
    11.   }
    12.    echo "<span class='desc'>$str</span>";
    Вроде бы вот это
    PHP:
    1. $str = preg_replace("/^(".$k.".*?)\b/iu", "<a href='".$v."'>\\1</a>", $str, 1);
    то, что мне нужно, но почему-то не работает(
    Хелп.
     
  2. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Попробуйте в качестве ограничителей выражения использовать что-нибудь, кроме " / ", например, ' # '.
     
    mazahaler нравится это.
  3. mazahaler

    mazahaler Новичок

    С нами с:
    2 ноя 2017
    Сообщения:
    66
    Симпатии:
    2
    @karmay, не, не помогает.
     
  4. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    А почему foreach, я походу спросони чет не понимаю, давайте о приложении,
    у нас есть текст, и есть ключевые слова, задача -
    написать регулярку, в которую мы скармливаем текст, а она, там где есть ключевые слова, окружает их ссылками, так?
    а ссылки тоже где-то лежат, в соответствии с ключевыми словами
     
    mazahaler нравится это.
  5. mazahaler

    mazahaler Новичок

    С нами с:
    2 ноя 2017
    Сообщения:
    66
    Симпатии:
    2
    @karmay, да, именно так. У меня есть табличка в бд с id_статьи, ссылкой на статью и ключевым словом
     
  6. karmay

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

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    ^ - начало строки, это начало всей строки, а не слова, лучше использовать \b, это начало слова(конец слова).
    PHP:
    1. $text = 'Набор слов в которых чай встречается слово нечай, а иногда чрезвычайно или чайный';
    2. // ключевое слово чай
    3. $key = 'чай';
    4. // текст ссылки
    5. $link = '<a href = "http://ссылка">'.$key.'</a>';
    6.  
    7. $str = preg_replace("#\b$key#u", "$link", $text);
    8. // шаблон поиска -  начало слова, ключ, сюда попадет чай и чайный
    9. echo $str;
    я бы рекомендовал все таки ограничивать возможности регулярки и явно указывать какие символы идут после ключа, т.е. $key[a-яА-Я], если конечно, не нужно выделять слова типа чай123 или чай%:?
     
    mazahaler нравится это.
  7. mazahaler

    mazahaler Новичок

    С нами с:
    2 ноя 2017
    Сообщения:
    66
    Симпатии:
    2
    @karmay, спасибо, помогло. То, что нужно!