Попытка str_ireplace и preg_replace?

Я пытаюсь заменить строку из исходного текста. ( zinc --> zn )

Пример: 'zinc zinc zinc zinc3 !zinc zincmatic #zinc zinc9 Zinc @zinc@'

Хочу: 'zn zn zn zinc3 !zn zincmatic #zinc zinc9 zn @zinc@'

Попытка str_ireplace:

$text = 'zinc zinc zinc zinc3 !zinc zincmatic #zinc zinc9 Zinc @zinc@';
$word = 'zinc';
$attr = 'zn';

// cant str_ireplace now as zincmatic will turn into znmatic and #zinc will turn into #zn
$text = ' '.$text.' '; 
$word = ' '.$zinc.' ';

// will try now
$result = str_ireplace($word, $attr, $word);
echo trim($result);

Печатает zn zinc zn zinc3 !zinc zincmatic #zinc zinc9 zn @zinc@. Все еще есть проблемы, так как !zinc и второй zinc остаются из-за нехватки места..

Попытка preg_replace:

$text = 'zinc zinc zinc zinc3 !zinc zincmatic #zinc zinc9 zinc';
$word = 'zinc';
$attr = 'zn';
$result = preg_replace("/\b($word)\b/i",$attr,$text);
echo $result;

Отпечатки zn zn zn zinc3 !zn zincmatic #zn zinc9 zn @zn@ почти получили то, что я хотел: кажется, что цинк превратится в zn, даже если рядом есть какой-то специальный символ, например, !zinc или #zinc, но не если есть число zinc9 или текст, например zincmatic

Я просто хочу поместить здесь правило, чтобы #zinc сохраняло #zinc, @zinc@ сохраняло @zinc@, а !zinc превращалось в !zn.

Есть ли способ добавить некоторые исключения для специальных символов, если цинк находится рядом с одним из них (например: #zinc, zinc#, zinc@, @zinc)

Символы, которые я хочу использовать, это #, &, @.

Спасибо!


person Pedro P    schedule 02.09.2011    source источник


Ответы (1)


Вы можете определить такие исключения с отрицательными утверждениями. Они ведут себя аналогично \b и фактически могут использоваться вместе.

В вашем случае вы хотите, чтобы (?<![#&@]) проверил предыдущий символ, а (?![#&@]) проверил следующий символ.

= preg_replace("/(?<![#&@])\b($word)\b(?![#&@])/i",$attr,$text);
person mario    schedule 02.09.2011