[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Wikipedia
oskin
Необходимо в тексте либо подсветить, либо сослаться на другую страницу <a href””></a> по ключевым словам. Набор слов беру из XML файла.

Пример XML файла:
<Wikipedia>
<Item>
<Title>Acceleration/Deceleration — АС</Title>
<Url>/encyclopedia/ac.html</Url>
<Words>Acceleration/Deceleration|AC</Words>
<Body>Технический индикатор Ускорения/Замедления (Acceleration/Deceleration, AC) измеряет ускорение и замедление текущей движущей cилы.</Body>
</Item>
<Item>
<Title>Тренд</Title>
<Url>0</Url>
<Words>Тренд|Trend</Words>
<Body>движущая фаза рынка или действующая волна. Поступательное ценовое движение вверх или вниз</Body>
</Item>
</Wikipedia>

Притом первый элемент выступает как ссылка на другую страницу (Url=0).


Должно получится примерно так:

Для первого элемента

Текст Acceleration/Deceleration заменяется на

<a href=”/encyclopedia/ac.html” title=”Технический индикатор Ускорения/Замедления (Acceleration/Deceleration, AC) измеряет ускорение и замедление текущей движущей cилы.” class=”wiki”>Acceleration/Deceleration</a>


Для второго:

Текст Trend заменяется на

<span title=”движущая фаза рынка или действующая волна. Поступательное ценовое движение вверх или вниз” class=”wiki”>Trend</span>


Как бы это реализовать


Поиск не помог



Спустя 8 часов, 16 минут, 27 секунд (6.12.2008 - 11:20) dfsq написал(а):
Разбирай XML, в чем проблема?

Спустя 20 часов, 18 минут, 25 секунд (7.12.2008 - 07:39) oskin написал(а):
dfsq>>

Проблема в замене текста в HTML коде страницы.
просто используя preg_replace( Text, Text2 .. ) не получится.
надо учитывать еще и теги а также ссылки на др. страницы.

XML парсим в структуру... далее как заменять

Спустя 8 часов, 39 минут, 47 секунд (7.12.2008 - 16:19) Alchemist написал(а):
хмм... я искренее надеюсь, что ты знаешь, чем preg_replace() отличается от str_replace()... Потому что описаные тобой случаи являются проблемой для второй функции, но никак не для первой...

Спустя 23 часа, 4 минуты, 12 секунд (8.12.2008 - 15:23) oskin написал(а):
Вот что получилось может можно сделать красивее:

Код


<?php

/*
* @ Wikipedia
*
*
* @ Format XML

<Wikipedia>
 <Item>
 <Title>Acceleration/Deceleration — АС</Title>
 <Url>/encyclopedia/ac.html</Url>
 <Words>Acceleration/Deceleration|AC</Words>
 <Body>Технический индикатор Ускорения/Замедления (Acceleration/Deceleration, AC) измеряет ускорение и замедление текущей движущей cилы.</Body>
 </Item>

 <Item>
 <Title>Title2</Title>
 <Url>/Url2</Url>
 <Words>Text2</Words>
 <Body>Body2</Body>
 </Item>
</Wikipedia>


После парсинга XML необходимо образовать следующую структуру:

 $wiki_array = Array(
  'words_array' => Array( 'Acceleration/Deceleration|AC', 'Text2' ),
  'body_array'  => Array( 'Технический индикатор Ускорения/Замедления (Acceleration/Deceleration, AC) измеряет ускорение и замедление текущей движущей cилы.', 'Body2'),
  'url_array'    => Array( '/encyclopedia/ac.html', '/Url2')
  );

*
*
*
*/
 define( "WIKIDATA", “Wikipedia.XML" );
/*
* @ WikipediaQuery
*/
 function WikipediaQuery( $data, $wiki_array = Array() ) {
/*
* @ Исключаем из области замены теги Title, A, H1, H2, H3
*/
   preg_match_all('/(<a[^>]*>.*?<\/a>|<h1[^>]*>.*?<\/h1>|<h2[^>]*>.*?<\/h2>|<h3[^>]*>.*?<\/h3>|<title>(.*?)<\/title>)/is', $data, $tags);
   array_unique($tags);

   $tagListUn=array();
   $k=0;
/*
* @ Заменяем все теги на <Num> предварительно сохранив эти теги в $tagListUn
*/  
   foreach($tags[0] as $i) {
     $k++;
     $tagListUn[$k] = $i;
     $data=str_replace($i, '<' . $k . '>', $data);
   }
/*
* @ Выделяем все теги
*/
   preg_match_all('/<[^>]*>/', $data, $tags);
   array_unique($tags);

   $tagList=array();
/*
* @ Заменяем все теги на <Num> предварительно сохранив эти теги в $tagList
*/  
   foreach($tags[0] as $i) {
     $k++;
     $tagList[$k] = $i;
     $data=str_replace($i, '<' . $k . '>', $data);
   }
/*
* @ Ищем и заменяем (подсвечиваем) слова
*/
   foreach($wiki_array[words_array] as $key => $i) {
     
     $i = array_map(  create_function(
         '$t',
         'return preg_quote($t,"/");'
         ),
         $i );

     if(!empty($wiki_array[url_array][$key]) and !empty($wiki_array[body_array][$key])) $wiki_type = 1;
     elseif(!empty($wiki_array[url_array][$key])) $wiki_type = 2;
     else $wiki_type = 0;

     preg_match_all( '/\W(' . implode("|", $i) . ')\W/i', $data, $matches);
     
     if( count( $matches[1] ) > 0 ) {
       array_unique($matches[1]);

       foreach( $matches[1] as $b => $j ){
         $k++;
         
         switch( $wiki_type ) {
           case 0:
             $tagList[$k] = '<span class="wiki" title="'.$wiki_array[body_array][$key].'">'.$j.'</span>';
           break;
           case 1:
             $tagList[$k] = '<a href="'.$wiki_array[url_array][$key].'" class="wiki" title="'.$wiki_array[body_array][$key].'">'.$j.'</a>';
           break;
           case 2:
             $tagList[$k] = '<a href="'.$wiki_array[url_array][$key].'" class="wiki">'.$j.'</a>';
           break;
         }

         $data=preg_replace( '/(\W)('. preg_quote($j,'/') .')(\W)/i', '$1<' . $k . '>$3', $data);
       }

     }

   }

/*
* @ Обратное преобразование
*/
   foreach($tagList as $k=>$i) {
     $data=str_replace('<' . $k . '>', $i, $data);
   }

   foreach($tagListUn as $k=>$i) {
     $data=str_replace('<' . $k . '>', $i, $data);
   }

   return $data;
 }

   

?>

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

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