str_replace和preg_replace尝试?

时间:2011-09-02 09:01:45

标签: php string preg-replace str-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 < / p>

如果锌靠近其中一个,有没有办法为特殊字符添加一些例外(例如:#zinczinc#zinc@@zinc

我希望成为行为的角色是#&@

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用否定assertions定义此类例外。它们的行为类似于\b,实际上可以结合使用。

在您的情况下,您希望(?<![#&@])探测前一个字符,并(?![#&@])来测试以下字符。

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