Сложный реплейс

gms

Guest
Сложный реплейс

Задача: есть строчный массив со списком некоторых значений (ну скажем $arr), есть текст в формате хтмл (например $text). нужно заменить все встречающиеся элементы массива $arr в тексте $text на ссылку (<a href="http://что-то">$arr</a>), причем, чтобы не получались каши (ссылка в ссылке) и не нужно заменять если этот текст входит в заголовок (<h1>, <h2>, ..).

Гуру, помогите, совершенно не знаю с какой стороны браться :confused:
 

HEm

Сетевой бобер
PHP:
while (list ($key, $val) = each ($arr)) {
  if () {
  if () {
  if () {
  if () {
  if () {
  if () {

и т.д.

  str_replace();
  }
  }
  }
  }
  }
  }
}
примерно так....
 

gms

Guest
HEm

самое интересное заключается в этих if() :-(
 

HEm

Сетевой бобер
расписываем подробнее:

находим очередное место (в позиции x), смотрим по строке назад от него, если есть <a но между ним и x нет </a то замена не катит
точно так же с любым другим тегом
 

HEm

Сетевой бобер
возможно, это можно сделать и регулярным выражением но, имхо, составить его будет весьма сложно
 

gms

Guest
HEm

это идея мне приходила в голову (честно :) ), но я ее отбросил как ресурсоемкую, поскольку $text может быть достаточно большим. неужели нет способа красивее?
 

HEm

Сетевой бобер
если ты таким образом формируешь страницу перед выводом то стоит подумать о кешировании
какая задача такое и решение
а ты попробуй, я смотрю тут за n минут такой способ реализовать можно, померяй время выполнения и выдай результаты сюда
 

Andr

Guest
не уверен, что менее ресурсоемко :)

но логика простая. правда хтмл должен быть не слишком кривым :)
PHP:
$text1 = explode("<",$text);
foreach ($arr as $v)
{
  $a = 0;
  foreach ($text1 as $i=>$t)
 {
    if (preg_match("/^h(\d)/i",$t)) continue;
    if (preg_match("/^a\s+/i",$t)) {$a++; continue;}
    if (preg_match("/^\/a>/",$t)) $a--;
    if (!$a) $t = preg_replace("/$v/","<a href=http://x3/x3>$v</a>",$t);
   $text1[$i] = $t;
  }
}

$text = implode("<",$text1);
echo $text;
условия - <h, <a, /a> без пробелов (если с пробелами, править регу)
 
Сверху