|
|
|
| Здравствуйте. Буду крайне признателен, если поможете разобраться.
Задача:
Дан текст
Дума думала <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>
|
Заметьте, что после замены, регистр слов должен сохраниться.
Если у Вас не получается полностью решить эту задачу, буду рад каким-то идеям. Может получится собрать решение из идей.
Заранее благодарен,
Эльнур | |
|
|
|
|
|
|
|
для: 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> - придётся ещё одной заменой обходить. | |
|
|
|
|
|
|
|
для: cheops
(08.11.2006 в 17:56)
| | О, класс! А я там мудрил...
Объясните пожалуйста, что значит
Почему там два слэша?
> Правда ситуацию <a href="#">дума</a> - придётся ещё одной заменой обходить.
Есть идеи, как это сделать?
Спасибо,
Эльнур | |
|
|
|
|
|
|
|
для: Real1st
(08.11.2006 в 18:50)
| | \\0 - это означает подставить всё регулярное выражение, которое найдено, если \\1 - то фрагмент в первых круглых скобках, \\2 - во вторых и т.д.
С уже существующими ссылками нужно сначала выяснить какая ссылка должна в результате остаться - изначальная или новая, т.е. какая ссылка важнее? | |
|
|
|
|
|
|
|
для: cheops
(08.11.2006 в 22:49)
| | Нужно оставить старую. Есть идеи?
С уважением,
Эльнур | |
|
|
|
|
|
|
|
для: Real1st
(08.11.2006 в 18:50)
| | >\\0
>Почему там два слэша?
Не два, а один. В строке PHP запись \\ означает ОДИН слэш. | |
|
|
|
|
|
|
|
для: Trianon
(08.11.2006 в 23:56)
| | Теперь понял, спасибо
Эльнур | |
|
|
|
|
|
|
|
для: cheops
(08.11.2006 в 17:56)
| | Так есть у Вас предложение, как оставить старую ссылку? | |
|
|
|
|
|
|
|
для: 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;
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(10.11.2006 в 02:36)
| | Огромное спасибо за помощь!
Тока я удалил из $pattern комбинацию [\s]*, а то он брал и пробелы после слова "дума".
С уважением,
Эльнур | |
|
|
|
|
|
|
|
для: cheops
(10.11.2006 в 02:36)
| | Вот занятно: локально эта конструкция работает, а на сервере - на в какую... К чему бы это? | |
|
|
|
|
|
|
|
для: Loki
(09.01.2007 в 14:55)
| | локаль одна и та же? | |
|
|
|