Есть входящий текст, в котором нужно заменить некоторые слова на ссылки. Перечень слов берется из базы данных, в которой хранится ссылка и анкор для замены. Споткнулся вот на чем, например если такой список замены: 1. F-2 2. виза F-2 3. американская виза F-2 При такой варианте слов в тексте будет произведено аж 3 замены. Помогите составить регулярку чтобы меняло только 1 раз в зависимости от того какое слово встретит первым.
В функции preg_replace можно указать четвертым параметром(limit) сколько вхождений должно быть заменено, то есть так: PHP: echo preg_replace('~string to find~', 'string to replace', $str, 1);
тут регулярками не обойтись, кмк. Тебе надо сначала разобраться со своими сущностями. Быстрым решением видится выборка из базы ORDER BY STRLEN(string) DESC Таким образом мы меняем сначала длинные слова, потом короткие. Чтобы в уже поменяных ссылках не подставлялись снова ссылки (ваша проблема), меняем по регулярке Code: (F-2)(?!.*(?:<\/a>)|(".*>)) И будет нам счастье. Кстате, рекомендую всем поставить тестилки регулярок прямо в браузер. Для FF — https://addons.mozilla.org/ru/firefox/addon/rext/?src=search (в фаере давно не сидел, возможно появилось что-то лучше) Для Chrome — https://chrome.google.com/webstore/detail/regexp-tester-app/cmmblmkfaijaadfjapjddbeaoffeccib?hl=ru
Почему-то не во все нужных словах производится замена. Делаю так: PHP: $sql="select * from links order by words desc"; $res=db_select($sql); while($row=mysql_fetch_array($res)) { $link[].= $row['link']; $ankor[].= $row['ankor']; } for($i=0; $i<=count($link)-1; $i++) { $text = preg_replace('#('.$ankor[$i].')(?!.*(?:<\/a>)|(".*>))#i', '<a href=\"'.$link[$i].'\">'.$ankor[$i].'</a>', $text); } Входящий текст: Текст после замены: В этом текст почему-то не поменяла еще одну фразу: "визу M-2"
А выведи все слова из базы? у меня по твоему тексту и по твоим словам Code: ((визу M-2)|(визе F-2)|(визы M-1))(?!.*(?:<\/a>)|(".*>)) регулярка видит все вхождения.
у меня для замены около 400 слов и фраз. Не ляжит ли сервер при : ((визу M-1)|...400...|(визы M-N))(?!.*(?:<\/a>)|(".*>))