Что такое str_ireplace и preg_replace? - PullRequest
       21

Что такое str_ireplace и preg_replace?

2 голосов
/ 02 сентября 2011

Я пытаюсь заменить строку из исходного текста.(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)

Символы, которые я хочу быть исключениями: #, &@

Спасибо!

1 Ответ

3 голосов
/ 02 сентября 2011

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

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

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