Пример 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 парсим в структуру... далее как заменять
Проблема в замене текста в 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; } ?> |