我正在尝试从原始文本中替换字符串。 (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>
如果锌靠近其中一个,有没有办法为特殊字符添加一些例外(例如:#zinc
,zinc#
,zinc@
,@zinc
)
我希望成为行为的角色是#
,&
,@
谢谢!
答案 0 :(得分:3)
您可以使用否定assertions定义此类例外。它们的行为类似于\b
,实际上可以结合使用。
在您的情况下,您希望(?<![#&@])
探测前一个字符,并(?![#&@])
来测试以下字符。
= preg_replace("/(?<![#&@])\b($word)\b(?![#&@])/i",$attr,$text);