Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сложная замена слов на ссылки
 
 автор: Disel   (20.09.2010 в 16:17)   письмо автору
 
 

Столкнулся с такой проблемой:
Есть некий текст, в котором есть обычные слова, ссылки и картинки. Задача состоит в том, чтобы заменить некоторые слова на ссылки, на при этом еще должны выполнятся условия:

1.Текст ссылки должен оставаться без изменений (с учетом регистра)
2.Замена не должна происходить в уже имеющихся ссылках
3.Замена не должна происходить и title и alt картинок
4.Нужно учесть позицию слова в тексте : начало, конец строки, в кавычках или в тегах.
5.Каждому набору слов соответствует определенная ссылка
6.Замена происходит даже в словах, где ссылка будет частью слова


<?php
#Строка текста :

$str= <<<HTML
Манчестер Сити - все о футболе.<img style="padding:10px;" src="http://football.com/img/robinjo.jpeg" title="Бразильский нападающий «Манчестер Сити»  Робиньо" />
Бразильский нападающий «Манчестер Сити»  Робиньо перешел в итальянский «Милан», подписав контракт сроком на четыре года, сообщает во вторник AP со ссылкой на официальный сайт гранда Серии А. В 2008-м он был куплен «Манчестер Сити» за рекордные для чемпионата Англии  деньги.
<br />Англия еще носит название : "<i>Туманный АльБион</i>"  
HTML;

#Слова и ссылки для замены берутся из базы данных (слова записаны через запятую ,им соответствует одна ссылка)
#Например: $row['words']="англия,туманный альбион"; $row['href']="http://mysite.com/england.html";

$li=$db->query(" SELECT * FROM linker "); // выбираем из базы все слова и ссылки

while($row=$db->get_row($li)){

$search=trim(str_replace(',''|'$row['words']));  // приводим слова к виду: слово1|слово2|слово3...
#Вот моя регулярка:
$str preg_replace('/(?!<a.*?>\S+)([ \S])('.$search.')([ \S])(?!\S+<\/a>)/si'"\\1<a href=\"".$row['href']."\">\\2</a>\\3"$str );
}

echo 
$str;

?>


В базе, например, есть такие словосочетания :
Манчестер Сити
англи,туманный альбион


На выходе я хотел бы получить следующий текст:

<a href="http://mysite.com/manchester.html">Манчестер Сити</a> - все о футболе.<img style="padding:10px;" src="http://football.com/img/robinjo.jpeg" title="Бразильский нападающий «Манчестер Сити»  Робиньо" />
Бразильский нападающий «<a href="http://mysite.com/manchester.html">Манчестер Сити</a>»  Робиньо перешел в итальянский «Милан», подписав контракт сроком на четыре года, сообщает во вторник AP со ссылкой на официальный сайт гранда Серии А. В 2008-м он был куплен «<a href="http://mysite.com/manchester.html">Манчестер Сити</a>» за рекордные для чемпионата <a href="http://mysite.com/england.html">Англи</a>и  деньги.
<br /><a href="http://mysite.com/england.html">Англи</a>я еще носит название : "<i><a href="http://mysite.com/england.html">Туманный АльБион</a></i>"


Но почему то с этой регуляркой работает не совсем так как надо, хотя в ссылках текст на ссылки не меняет...

  Ответить  
 
 автор: heed   (20.09.2010 в 18:29)   письмо автору
 
   для: Disel   (20.09.2010 в 16:17)
 

Здесь нет красивых и быстрых решений,
я-бы лишний раз задумался не отказаться-ли совсем от такой подсветки при каждой генерации страницы.
или не изобрести-ли какой-нибудь другой велосипед вместо например такого трактора.
<?php
//header('content-type: text/plain');

 
function z($m){
    global 
$row;
    return (isset(
$m[1]))? $m[0]
    : 
preg_replace('#'str_replace(',''\b|\b''\b'trim($row['words']) .'\b') .'#i',
        
'<a href="'$row['href'] .'">$0</a>'$m[0]); 
 }
 
#Строка текста : 

$str ='Манчестер Сити - все о футболе.
<img style="padding:10px;" src="robinjo.jpeg" title="Бразильский нападающий «Манчестер Сити»  Робиньо" /> 
Бразильский нападающий «Манчестер Сити»  Робиньо перешел в итальянский «Милан»,
 подписав контракт сроком на четыре года, сообщает во вторник AP со ссылкой 
 на официальный сайт гранда Серии А. В 2008-м он был куплен «Манчестер Сити» за рекордные 
 для чемпионата Англии  деньги. 
<br />Англия еще носит название : "<i>Туманный АльБион</i>"'
;

$a = array(
array(
'words'=>'англия,туманный альбион''href'=>'/1land.html'),
array(
'words'=>'Бразильск[А-Яа-яЁё]*,Бразилия''href'=>'/2land.html'),
array(
'words'=>'итальянск[А-Яа-яЁё]*,италия''href'=>'/3land.html'),
);

$row['words']="англия,туманный альбион";
$row['href']="http://mysite.com/england.html"

do {
    
$row current($a);
    
$str preg_replace_callback('#(<)a\b[^>]*>.*?</a>\s+|(<)[^>]*>\s+|[^<]+#s''z'$str);

} while (
next($a) !== false);

echo 
$str;

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования