Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Поставить урл у слова и словосочитания (где есть такое же слово)
"На этом сайте вы можете приобрести <ahref:talisman.html>талисман</a> по знакам зодиака. А так же <ahref:talisman.html>талисман</a> путешественника и другие."
"На этом сайте вы можете приобрести <ahref:talisman.html>талисман</a> по знакам зодиака. А так же <ahref:talisman_puteshestvennika.html>талисман путешественника</a> и другие."
Заранее спасибо за ответ.
JustUserR
Отправлено: 09 Июня, 2010 - 11:21:11
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Dilex пишет:
Как сделать чтобы получалось вот так
В вашем случае используемое POSIX-регулярное выражение выполняет исключательно функцию замены подстрок - и в таком случае решением будет упорядочивание искомых подстрок в порядке убывания длины чтобы сначала заменялась самая длинная и тд - и при этом для того чтобы при проходе по более короткой подстроке которую включала в себя более длинная нужно проверить к примеру наличие a-href-тега слева и не проводить повторную замену
Более эффективным способом было бы использование PCRE-регулярного выраржния по вышеуказанному алгоритму - то есть проходите по всем искомым строкам с учетом длины и перед очередной заменой проверяете не был ли уже использован данный текст
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Dilex
Отправлено: 09 Июня, 2010 - 11:41:49
Новичок
Покинул форум
Сообщений всего: 17
Дата рег-ции: Март 2009
Помог: 0 раз(а)
Спасибо. Отличная идея.
JustUserR
Отправлено: 09 Июня, 2010 - 11:46:00
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Dilex пишет:
Спасибо. Отличная идея.
Пожалуйста! Заметьте также что такой вариант является одним из самых быстродейственных - поскольку хотя перед каждой вставкой он использует дополнительную проверку на факт прохождения подстрокой определенной обработки - но если хранить строковые позиции обработанных значений то их перерасчет при каждой итерации занимал бы большее время особенно при росте объема обрабатываемых данных
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Dilex
Отправлено: 18 Июня, 2010 - 23:59:38
Новичок
Покинул форум
Сообщений всего: 17
Дата рег-ции: Март 2009
Помог: 0 раз(а)
C первого взгляда, было понятно как это сделать, а как дошло до дела, сразу возникли вопросы
Почему-то функция eregi_replace() , сначала заменяет короткие строки, а потом длинные , причем от перестановки выше или ниже, замена не зависит. Если я введу ниже описанные строки, то он заменит, только "аму", а "амулет", вообще заменять не будет.
echo name_to_url ("На этом сайте вы можете приобрести талисман по знакам зодиака.
А так же талисман путешественника и другие.");
?>
(Добавление)
Просто штука в том, что по первому ключу всё действительно заменялось, а после этого заменялось по второму. И получалась штуковина типа текст <a href=talisman_putesestv.html><a href=talismanv.html>талисман</a>путешественника</a>.
И браузер отобразил такую вещь так, как посчитал нужным. А надо просто при замене проверять, не заменяем ли мы внутри уже произведенной замены.
Dilex
Отправлено: 19 Июня, 2010 - 10:55:04
Новичок
Покинул форум
Сообщений всего: 17
Дата рег-ции: Март 2009
На этом сайте вы можете приобрести талисман по знакам зодиака. А так же <ahref='talisman.html'>талисман</a> путешественника и другие. <ahref='talisman_puteshestvennika.html'>Талисман путешественника</a> помогает в пути
Т.е. в укороченном варианте текста, все получается, а вот в длинном ...
JustUserR
Отправлено: 19 Июня, 2010 - 11:41:40
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Dilex пишет:
Т.е. в укороченном варианте текста, все получается, а вот в длинном
Дело может быть в наличии регулярных выражений жадных квантификаторов и в неправильном порядке заменяемых шаблонов По этой причине схема должны быть несколько универсализирована чтобы оригинальный порядок следования не имел значения и каждая замена могла применяется сколько угодно раз - конкретно для этого функция расставляет шаблоны в порядке уменьшения их длины и для каждого из шаблонов запускает регулярное выражение с полным поиском Также было бы полезно учитывать различные словоформы - для этих целей применяется алгоритм типа Стеммера Портера
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Champion
Отправлено: 19 Июня, 2010 - 12:41:43
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
По поводу словоформ, можно просто самому в ключах задать неизменяемые части слова, а матчить примерно так/$key\w+/.
А по поводу замены - да, она так срабатывает. Если по-простому, то в строке 455555655556 шаблон /4\d+?(6)/ сматчится только одна шестерка...
Наиболее простым способом мне кажется использовать preg_replace_callback, которая <a href...> C ВОТ ЭТОИМ</a> сделает htmlspecialchars, чтоб оно больше не матчилось. (Добавление)
Только регулярку эту убрать /((?:<\/a>|^)[^<]*)({$n[0]})/i и сделать простоую вот эту /($n[0])/i. Ну и ключи надо располагать не забывать в порядке убывания длин, как ты и сделал, и как напомнил JusrUserR
JustUserR
Отправлено: 20 Июня, 2010 - 13:23:15
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Champion пишет:
По поводу словоформ, можно просто самому в ключах задать неизменяемые части слова
Да в принципе можно сделать и так и в большинстве слов это будет работать - проблема только со словами в который при изменении грамматической формы меняется корень или он короткий и неочевидный для проверки Но в общем для системы цель которой не алаиз текста а генерация рекламных ссылок - это более чем подходящий вариант
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Dilex
Отправлено: 22 Июня, 2010 - 14:15:39
Новичок
Покинул форум
Сообщений всего: 17
Дата рег-ции: Март 2009
Помог: 0 раз(а)
Уф-фф. Наконец-то сделал.
Я не сразу сообразил, что надо html кода смотреть, а смотрел на результат
вывода в броузер. А броузер выводил только ссылки с самым минимальным
количеством букв. Поэтому у меня было удивление, почему про эту проблему
никто ничего не пишет . А когда открыл html код сразу увидел о чем писал
JustUserR.
Вот код в котором расставляются ссылки, с условием, что
ссылка не ставится второй раз:
Сортировку по длине ссылок тоже сделал, как и рекомендовали.
Всем спасибо за ответы !
JustUserR
Отправлено: 22 Июня, 2010 - 14:27:22
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Dilex пишет:
Поэтому у меня было удивление, почему про эту проблему
никто ничего не пишет . А когда открыл html код сразу увидел о чем писал
JustUserR.
Это весьма стандартныый вопрос при работе со строковыми данными - именно поэтому в машине регулярных выражений была добавлена возможность поиска назад и вперед
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.