Студент Иванов сдал сессию. <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 раз быстрее
И, кстати, мой код выполняется ровно в 10 раз быстрее
Спустя 5 часов, 1 минута, 30 секунд (2.10.2010 - 08:49) DedMorozzz написал(а):
Грамотная регулярка быстрее быстрее объёмных строковых функций.
А конструкции "(?: " ещё ускоряют алгоритм, поскольку не возвращается индекс элемента.
По сабжу - ответа не увидел сразу. В пн напишу решение, если будет актуально.
А конструкции "(?: " ещё ускоряют алгоритм, поскольку не возвращается индекс элемента.
По сабжу - ответа не увидел сразу. В пн напишу решение, если будет актуально.
Спустя 2 дня, 1 час, 15 минут, 30 секунд (4.10.2010 - 10:04) DedMorozzz написал(а):
Такс...вот и настал час ИКС. Заменить на ссылку лишь 1е вхождение?
А насчёт того, что вырезать не вариант - тут поможет конкатенация. Т.е. работать с 2мя разными кусками, далее их "склеить".
А насчёт того, что вырезать не вариант - тут поможет конкатенация. Т.е. работать с 2мя разными кусками, далее их "склеить".
_____________