За последние 24 часа нас посетили 18848 программистов и 1615 роботов. Сейчас ищут 670 программистов ...

Замена слова на ссылку

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

  1. AleksNN

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

    С нами с:
    11 авг 2010
    Сообщения:
    1
    Симпатии:
    0
    Необходимо заменить слово на ссылку, естественно, если оно уже не находится внутри ссылки.

    С помощью утверждений (?<!) и (?!) не получается учесть ни мусор, который может быть с искомым текстом, ни атрибутов ссылки:
    Код (Text):
    1. (?<!\<a\>) SOME_TEXT (?!\<\/a\>)
    Мусор можно учесть с помощью символьного типа \W:
    Код (Text):
    1. (^|[\W]+)SOME_TEXT($|[\W]+)
    Но объединить их не получается.

    Исходник тестов:


    Код (Text):
    1. $p = 'text';
    2.  
    3. echo '<h2>Замена слова на ссылку с помощью утверждений</h2>';
    4.  
    5. $test[] = '<a> text ';
    6. $test[] = '<a>  text ';
    7. $test[] = '</a> text ';
    8. $test[] = ' text <a>';
    9. $test[] = ' text </a>';
    10. $test[] = '<a> text </a>';
    11. $test[] = ' text <a> text';
    12. $test[] = '<a> text </a> text ';
    13.  
    14.  
    15.  
    16. foreach ($test as $key => $val) {
    17.  
    18.   echo preg_replace('/(?<!\<a\>) ('.$p.') (?!\<\/a\>)/', '<a href="">$1</a>', $val).'<br />'."\r\n";
    19. }
    20.  
    21.  
    22. unset($test);
    23.  
    24. echo '<h1>Замена слова на ссылку с учетом мусора</h1>';
    25.  
    26. $test[] = 'textffdd text';
    27. $test[] = 'text textEFff';
    28. $test[] = '.text,';
    29. $test[] = '<a href="">  fds text.. </a>  //\text"""';
    30. $test[] = '!text<';
    31. $test[] = '<a href="">text</a>2""/\text';
    32.  
    33. foreach ($test as $key => $val) {
    34.  
    35.   echo preg_replace('/(^|[\W]+)('.$p.')($|[\W]+)/', '$1<a href="/">$2</a>$3', $val).'<br />'."\r\n";
    36. }
     
  2. MaxTyT

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

    С нами с:
    10 авг 2010
    Сообщения:
    5
    Симпатии:
    0
    Капни в сторону такого условия: Перед заменяемым словом text должно быть вхождений <a>...</a> 0 или больше раз. Что-то вроде этого, я не проверял:
    Код (Text):
    1.  
    2. '/(?<=[<a>(.+?)<\/a>]*) (' . $p . ')(.+?)/'