[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Поиск слова не в ссылке
Monti
Долго мучался с написанием регулярки для поиска определенного слова, которое не находится в анкоре ссылки. Например:
Студент Иванов сдал сессию. <a href="http://google.com.ua/" title="Translate" target="_blank">Студент Иванов просто</a> молодец. Иванов.


Должно найти два раза Иванов.

Для поиска слова которое находится в анкоре получается, а вот обратное не могу сделать. Может быть у кого-то уже была такая задача. Спасибо.



Спустя 1 час, 18 минут, 54 секунды (29.09.2010 - 12:53) DedMorozzz написал(а):
А что мешает в 2 действия? Сперва вырезать линки в отдельную переменную - а далее, из вырезанного, найти всех Ивановых:
<?php

$a ='Студент Иванов сдал сессию. <a href="http://google.com.ua/" title="Translate" target="_blank">Студент Иванов просто</a> молодец. Иванов.';

$b = preg_replace('#<a.*?>.*?</a>#s', '', $a);
preg_match_all('#Иванов#u', $b, $matches);
print_r($matches);

Спустя 2 дня, 17 минут, 44 секунды (1.10.2010 - 13:11) Monti написал(а):
Просто я ищу это слово, чтобы заменить его на ссылку.

На выходе необходимо получить:
$a ='Студент <a href="http://site.ru/">Иванов</a> сдал сессию. <a href="http://google.com.ua/" title="Translate" target="_blank">Студент Иванов просто</a> молодец. Иванов.';


И поэтому если удалить слова которые есть ссылки, то вконце получится обрезанный текст.

Спустя 13 часов, 8 минут, 26 секунд (2.10.2010 - 02:19) arvitaly написал(а):
На первый взгляд такое решение родилось

<?php

/**
*
@author Arvitaly
*
@copyright 2010
*/

$str='Студент Иванов сдал сессию. <a href="http://google.com.ua/" title="Translate" target="_blank">Студент</a> Иванов просто</a> молодец. Иванов.';
$word="Иванов";
$sl = strlen($word);
$newword= '<a href="http://site.ru/">' . $word . '</a>';
$sln=strlen($newword)-$sl;
$i=-1;
$oldi=0;
$diff=0;$newstr=$str;
while (($i=strpos ($str,$word,$i+1)))
{
if (preg_match("~^(?:(?:(?:(?:(?!<a\s|</a>).)*?)<a\s[^<>]*>(?:(?:(?!<a\s|</a>).)*?)</a>(?:(?:(?!<a\s|</a>).)*?))+|(?:(?!<a\s).)*?)$~si",substr($str,$oldi,$i-$oldi)))
{
$newstr=substr($newstr,0,$i+$diff) . $newword . substr($newstr, ($i+$diff+$sl));
if ($oldi==0)///////////Если нужно заменить только первое вхождение
{
break;
}
$diff+=$sln;
}
$oldi=$i;
}
echo $newstr;
exit;
?>

Спустя 1 час, 3 минуты, 43 секунды (2.10.2010 - 03:23) FatCat написал(а):
Всё бы вам регулярками...

$str = explode("<a ",$str);
foreach($str as $k=>$sub_str)
{
$i = 0;
if(stristr($sub_str,"</a>"))
{
while(substr($sub_str,$i,4) != "</a>")$i++;
$i += 4;
$str[$k] = substr($sub_str,0,$i).str_replace("Иманов",'<a href="http://site.ru/">Иванов</a>',substr($sub_str,$i));
}
}

$str = implode("<a ",$str);

Спустя 24 минуты, 9 секунд (2.10.2010 - 03:47) arvitaly написал(а):
Почему то первое вхождение не выделяется. А регуляркой для того, чтобы обработать даже некорректный html-код.

И, кстати, мой код выполняется ровно в 10 раз быстрее

Спустя 5 часов, 1 минута, 30 секунд (2.10.2010 - 08:49) DedMorozzz написал(а):
Грамотная регулярка быстрее быстрее объёмных строковых функций.
А конструкции "(?: " ещё ускоряют алгоритм, поскольку не возвращается индекс элемента.
По сабжу - ответа не увидел сразу. В пн напишу решение, если будет актуально.

Спустя 2 дня, 1 час, 15 минут, 30 секунд (4.10.2010 - 10:04) DedMorozzz написал(а):
Такс...вот и настал час ИКС. Заменить на ссылку лишь 1е вхождение?
А насчёт того, что вырезать не вариант - тут поможет конкатенация. Т.е. работать с 2мя разными кусками, далее их "склеить".


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.