Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » ASP, Perl, PHP и MySQL

Фразы-слова в ссылки

Обсуждение темы Фразы-слова в ссылки в разделе ASP, Perl, PHP и MySQL, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; Приветствую. Есть задача - по некоторому списку фраз в формате регулярных выражений Код: (1слов(о|а)* 2слов(о|а)* 3слов(о|а)* 4слов(о|а)*) Производить замену на ссылку на определенную ...


Закрытая тема
 
Опции темы
Старый 23.06.2009, 14:49   #1
Приветствую.

Есть задача - по некоторому списку фраз в формате регулярных выражений
Код:
(1слов(о|а)* 2слов(о|а)* 3слов(о|а)* 4слов(о|а)*)
Производить замену на ссылку на определенную страницу, если (!!!) эта фраза/часть фразы не выделены каким-либо акцентирующим тегом (strong/b/i/u и т.д.) и не является уже ссылкой... т.е. провести замену на
Код:
<a href="...">фраза-в-том-виде-как-была</a>
Попытался сделать так
Код:
$lnk = array('txt'=>array(), 'lnk'=>array());
$lnk['txt'][] = "#([^\\w>])(1слов(о|а)* 2слов(о|а)* 3слов(о|а)* 4слов(о|а)*)([^\\w<])#i"; $lnk['lnk'][] = "\$1<a href='...'>\$2</a>\$7";
...
$txt = preg_replace($lnk['txt'], $lnk['lnk'], $txt);
Работало одно время, пока не натолкнулся на ситуацию, когда более длинная фраза имеет в середине менее короткую... и тогда происходит двойная обработка =( и именно...
Код:
$lnk = array('txt'=>array(), 'lnk'=>array());
$lnk['txt'][] = "#([^\\w>])(1слов(о|а)* 2слов(о|а)* 3слов(о|а)* 4слов(о|а)*)([^\\w<])#i"; $lnk['lnk'][] = "\$1<a href='...'>\$2</a>\$7";

$lnk['txt'][] = "#([^\\w>])(2слов(о|а)* 3слов(о|а)*)([^\\w<])#i"; $lnk['lnk'][] = "\$1<a href='...'>\$2</a>\$5";
...
$txt = preg_replace($lnk['txt'], $lnk['lnk'], $txt);
и в результате получаем не положенное
Код:
<a href="...">фраза-в-том-виде-как-была</a>
после обработки первой регуляркой, а двойная обработка фразы
Код:
<a href="...">фраза-в-<a href="...">том-виде</a>-как-была</a>
ХЕЛП!!! нужно реализовать алгоритм, когда заменяется на ссылку только ЧИСТЫЙ текст... не являющийся ссылкой и не выделенный какими-то акцинтирующими тегами =(

Добавлено через 1 час 44 минуты

Ну или на крайняк какую-то фишку, которая будет убирать вложенные теги <a>...</a>, чтобы из
Код:
<a href="...">фраза-в-<a href="...">том-виде</a>-как-была</a>
делало
Код:
<a href="...">фраза-в-том-виде-как-была</a>
Добавлено через 2 часа 35 минут

Нда... вощим сварганил - мож кому и пригодиться... На вход подается текст, на выходе заданные фразы (с учетом указанных словоформ) заменяются на ссылки (для которых указан адрес) и выделения стронгом (где адрес для ссылки не указан). Приоритетность сверху вниз (т.е. если фраза соответствует нескольким шаблонам, то отработает тот, который выше).

PHP код:
<?
function wspTxtLnk($txt)
{
 
$keys = array();
 
$keys[] = array('txt'=>"личн(ое|ого|ые|ых) дел(о|а)*"'lnk'=>"ссылочка");
 
$keys[] = array('txt'=>"автомобил(ь|е|я|ем|и|ями)"'lnk'=>"ссылочка");
 
$keys[] = array('txt'=>"дело(вой|вое)*");
 
/*-------------------------------------------------------------------------*/

 
$ttl trim($ttl);
 
$txt wspAddSpace($txt);
 foreach(
$keys as $i=>$key)
 {
  
$key['txt'] = "#([^\\w>])(".$key['txt'].")([^\\w<])#i";
  
$key['bld'] = "\$1<strong>\$2</strong>\$".substr_count($key['txt'], "(");
  if(
strlen($key['lnk']) > 0)
   
$key['lnk'] = "\$1<a href='".$key['lnk']."'>\$2</a>\$".substr_count($key['txt'], "(");
  if(
intval($key['cnt']) < 1)
   
$key['cnt'] = -1;
  
  if(
strlen($key['lnk']) > 0)
   
$txt preg_replace($key['txt'], $key['lnk'], $txt$key['cnt']);
  
$txt preg_replace($key['txt'], $key['bld'], $txt);
 };
 unset(
$keys);
 
 
$nt ''$ta '';
 
$k 0;  $ot $txt;
 
$tags 'a|b|strong|u|i';
 while(
strlen($ot) > 0)
 {
  if(
preg_match("#</{0,1}(".$tags.")(( )+[^>]*){0,1}>#i"$ot$tmPREG_OFFSET_CAPTURE) < 1)
   {
$nt .= $ot$ot ''; continue;};
  
$ta $tm[0][0];
  
$nt .= substr($ot0$tm[0][1]);
  
$ot substr($ot$tm[0][1]+strlen($ta));
  if(!
preg_match("#</(".$tags.")>#i"$ta))
   {if(
$k == 0$nt .= $ta$k++;}
  else
   {if(
$k == 1$nt .= $ta$k--;};
  if(
$k 0$k 0;
 };
 
$txt $nt

 return 
wspDelSpace($txt);
};

function 
wspAddSpace($txt)
{
 
$tgs = array('tag'=>array(), 'set'=>array());
 
$tgs['tag'][] = "#<(li|p|td)>#i"$tgs['set'][] = "\$0 ";
 
$tgs['tag'][] = "#</(li|p|td)>#i"$tgs['set'][] = " \$0";
 
$txt preg_replace($tgs['tag'], $tgs['set'], $txt);
 unset(
$tgs); return $txt;
};
function 
wspDelSpace($txt)
{
 
$tgs = array('tag'=>array(), 'set'=>array());
 
$tgs['tag'][] = "#(<(li|p|strong|u|i|em|td)>)( )+#i"$tgs['set'][] = "\$1";
 
$tgs['tag'][] = "#( )+(</(li|p|strong|u|i|em|td)>)#i"$tgs['set'][] = "\$2";
 
$txt preg_replace($tgs['tag'], $tgs['set'], $txt);
 unset(
$tgs); return $txt;
};
?>
Собиралось это дело на коленке под конкретную задачу, так что такие моменты, как разбор тегов с указаными классами, какие-то еще прибабахи - не учитывались - на вход подается чистый текстовый контентный блок.

Последний раз редактировалось zuart; 23.06.2009 в 14:49.. Причина: Добавлено сообщение
 
Старый 23.06.2009, 14:49
Ссылки
Старый 23.06.2009, 14:49
Закрытая тема




Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новый интернет-проект «Русские слова» Kren[Del *.*] Кальянная 13 22.07.2008 12:16
Сервис удобный (определить ИЦ, ссылаются, проиндексировано, найденые слова ...) KB200 Кальянная 0 29.05.2005 00:20
Убрать слова из песни в mp3 dimka_sh Кальянная 5 05.04.2005 16:33
Ключевые слова для ceng.ru dimok Зал дебютантов 4 02.10.2003 17:05
Ключевые слова Silver Поисковые системы 6 29.04.2003 00:08


Текущее время: 03:02. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Дизайнерский форум