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

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

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

 

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

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

тема: Обрамить слово тэгами <a> и </a>
 
 автор: Real1st   (08.11.2006 в 13:16)   письмо автору
 
 

Здравствуйте. Буду крайне признателен, если поможете разобраться.

Задача:
Дан текст

Дума думала <i>дума</i> над дума обдума <a href="#">дума</a> Дума <b>дума</b>


Нужно окружить все слова (независимо от регистра) "дума" (только слова, но не части других слов) тегами <a href="www.duma.ru"> и </a>. Слово для поиска может меняться, как и ссылка для него.
В моем случае это массив типа

$arr[ 'дума' ] = 'www.duma.ru';
$arr[ 'foo' ] = 'www.bar.com';


При этом, если слово уже обрамлено тегом ссылки, его нужно пропустить, но другие теги должны остаться.

Для каждого элемента массива $arr, текст будет прогоняться через preg_replace();

На выходе должно быть что-то типа

<a href="www.duma.ru">Дума</a> думала <i><a href="www.duma.ru">дума</a></i> над <a href="www.duma.ru">дума</a> обдума <a href="#">дума</a> <a href="www.duma.ru">Дума</a> <b><a href="www.duma.ru">дума</a></b>

Заметьте, что после замены, регистр слов должен сохраниться.

Если у Вас не получается полностью решить эту задачу, буду рад каким-то идеям. Может получится собрать решение из идей.

Заранее благодарен,
Эльнур

   
 
 автор: cheops   (08.11.2006 в 17:56)   письмо автору
 
   для: Real1st   (08.11.2006 в 13:16)
 

Можно поступить следующим образом
<?php
  $text 
"Дума думала <i>дума</i> над дума обдума <a href=\"#\">дума</a> Дума <b>дума</b>";
  
$pattern "|\bдума\b|is";
  
$text preg_replace($pattern"<a href=http://www.duma.ru>\\0</a>"$text);
  echo 
$text;
?>

Правда ситуацию <a href="#">дума</a> - придётся ещё одной заменой обходить.

   
 
 автор: Real1st   (08.11.2006 в 18:50)   письмо автору
 
   для: cheops   (08.11.2006 в 17:56)
 

О, класс! А я там мудрил...
Объясните пожалуйста, что значит

\\0

Почему там два слэша?

> Правда ситуацию <a href="#">дума</a> - придётся ещё одной заменой обходить.
Есть идеи, как это сделать?

Спасибо,
Эльнур

   
 
 автор: cheops   (08.11.2006 в 22:49)   письмо автору
 
   для: Real1st   (08.11.2006 в 18:50)
 

\\0 - это означает подставить всё регулярное выражение, которое найдено, если \\1 - то фрагмент в первых круглых скобках, \\2 - во вторых и т.д.

С уже существующими ссылками нужно сначала выяснить какая ссылка должна в результате остаться - изначальная или новая, т.е. какая ссылка важнее?

   
 
 автор: Real1st   (09.11.2006 в 12:42)   письмо автору
 
   для: cheops   (08.11.2006 в 22:49)
 

Нужно оставить старую. Есть идеи?

С уважением,
Эльнур

   
 
 автор: Trianon   (08.11.2006 в 23:56)   письмо автору
 
   для: Real1st   (08.11.2006 в 18:50)
 

>\\0
>Почему там два слэша?
Не два, а один. В строке PHP запись \\ означает ОДИН слэш.

   
 
 автор: Real1st   (09.11.2006 в 12:42)   письмо автору
 
   для: Trianon   (08.11.2006 в 23:56)
 

Теперь понял, спасибо

Эльнур

   
 
 автор: Real1st   (10.11.2006 в 01:55)   письмо автору
 
   для: cheops   (08.11.2006 в 17:56)
 

Так есть у Вас предложение, как оставить старую ссылку?

   
 
 автор: cheops   (10.11.2006 в 02:36)   письмо автору
 
   для: Real1st   (10.11.2006 в 01:55)
 

Можно поступить следующим образом
<?php 
  $text 
"Дума думала <i>дума</i> над дума обдума <a href=\"#\">дума</a> Дума <b>дума</b>"
  
$pattern "|\bдума\b[\s]*(?!</a>)|is"
  
$text preg_replace($pattern"<a href=http://www.duma.ru>\\0</a>"$text); 
  echo 
$text
?>

   
 
 автор: Real1st   (10.11.2006 в 11:06)   письмо автору
 
   для: cheops   (10.11.2006 в 02:36)
 

Огромное спасибо за помощь!

Тока я удалил из $pattern комбинацию [\s]*, а то он брал и пробелы после слова "дума".

С уважением,
Эльнур

   
 
 автор: Loki   (09.01.2007 в 14:55)   письмо автору
 
   для: cheops   (10.11.2006 в 02:36)
 

Вот занятно: локально эта конструкция работает, а на сервере - на в какую... К чему бы это?

   
 
 автор: Trianon   (09.01.2007 в 16:02)   письмо автору
 
   для: Loki   (09.01.2007 в 14:55)
 

локаль одна и та же?

   
Rambler's Top100
вверх

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