Помогите написать регулярное выражение

Focus

Новичок
Есть входящий текст, в котором нужно заменить некоторые слова на ссылки. Перечень слов берется из базы данных, в которой хранится ссылка и анкор для замены.

Споткнулся вот на чем, например если такой список замены:
1. F-2
2. виза F-2
3. американская виза F-2

При такой варианте слов в тексте будет произведено аж 3 замены. Помогите составить регулярку чтобы меняло только 1 раз в зависимости от того какое слово встретит первым.
 

Placido

Наблюдаю
Будет произведено по одной замене, если список замены сформировать в обратном порядке. Например:
PHP:
$txt = "F-2, виза F-2, американская виза F-2";
echo preg_replace('/американская виза F-2|виза F-2|F-2/', '<b>$0</b>', $txt);//<b>F-2</b>, <b>виза F-2</b>, <b>американская виза F-2</b>
 

Focus

Новичок
У меня очень большая база - почти 400 слов и фраз для автозамены.
+ Как в Вашес лучае менять на ссылку с анкором? Например слово "виза F-2" должно поменятьна <a href="http://link-to-f-2">виза F-2</a>
 

Placido

Наблюдаю
Тут, кстати, можно обойтись и без регулярки
PHP:
$txt = "F-2, виза F-2, американская виза F-2";
$replace = array(
    'F-2'                   => '<a href="http://1st_link">F-2</a>', 
    'виза F-2'              => '<a href="http://2nd_link">виза F-2</a>', 
    'американская виза F-2' => '<a href="http://3rd_link">американская виза F-2</a>');
echo strtr($txt, $replace);
//<a href="http://1st_link">F-2</a>, <a href="http://2nd_link">виза F-2</a>, <a href="http://3rd_link">американская виза F-2</a>
 

AmdY

Пью пиво
Команда форума
Focus
а зачем вам регулярные выражения. eсть str_replace
 

Focus

Новичок
Так не пойдет. Если 2 раза обработать текст, то ссылки будут вида <A href="link1"><a href="Link1">ankor</a></a>
Тут, кстати, можно обойтись и без регулярки
PHP:
$txt = "F-2, виза F-2, американская виза F-2";
$replace = array(
    'F-2'                   => '<a href="http://1st_link">F-2</a>', 
    'виза F-2'              => '<a href="http://2nd_link">виза F-2</a>', 
    'американская виза F-2' => '<a href="http://3rd_link">американская виза F-2</a>');
echo strtr($txt, $replace);
//<a href="http://1st_link">F-2</a>, <a href="http://2nd_link">виза F-2</a>, <a href="http://3rd_link">американская виза F-2</a>
 

qwezxc

Новичок
Приветствую, помогите заменить в строке все запятые на одну...
$str = 41,58,124,,59,60,61,62,63,,64,65,66,67,68,69,125,,,43,44,45,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,,47,85,86,87,88,89,90,91,,92,93,94,95,96,97,,98,99,101,100,102,103,104,,105,106,,107,108,109,110,111,112,,113,114,115,,123......................
Должна остаться только одна запятая между числами....
не шарю в регулярках....
 

qwezxc

Новичок
Gremboloid
да ну я как бы просил решение....А учебник (Рег. выражения Джефри Фридл) по регуляркам у мну есть, руки до него не доходят....
Я и сам не люблю когда пишут "сделайте за меня"...
 

Gremboloid

инженера Гр...
qwezxc, да такое сработает, но нет смысла переписывать одну запятую на запятую
замени + на квантификатор {2,}
 

qwezxc

Новичок
Gremboloid, а как тогда сделать? ) я понимаю что в том месте где встречается 1 запятая нет смысла ее переписывать....
 

DiMA

php.spb.ru
Команда форума
по первой задаче, че, никто не придумал нормальное решение?

отсортируй все по длине фраз, начинай с длинных

при замене очередной фразы проверяй регом, что найденный кусок находится вне блока открывающего-закрывающего тега (либо тегов в строке вообще нет, либо текст после закрывающего и перед открывающим найден)

preg_replace("!^([^<>]*$TEXT[^<>]*)|(.*</a>[^<>]*$TEXT.*)|(.*$TEXT[^<>]*<a.*)$!"

далее обработать $TEXT (чтобы не было спец.символов рег.выр) и правильно со скобками для замены разобраться

> $str = preg_replace("/\,+/",",", $str);

нафига запятую экранируем?
 
Сверху