我尝试构建一个标记系统,它运行正常,函数preg_replace()存在问题,它会从字符串中删除不必要的空格。
一个例子是我的字符串是
嘿!@Yosi
@Ben
空格将被删除,它将成为:
喂!
@ Yosi @奔
似乎因为我在preg_replace中的条件包含为字符串。
我的代码:
$String = preg_replace ('/(\s|^)@'.$Memory['Name'][$x].'(\s|$)/', '[URL="http://'.$_SERVER['HTTP_HOST'].'/member.php?u='.$Memory['UserID'][$x].'"]@'.$Memory['Name'][$x].'[/URL]', $String);
答案 0 :(得分:1)
你的正则表达式会剥离任何空格,因为它是(\s|^)
所寻找的内容。
在那里使用外观断言(?<=\s|^)
和(?=\s|$)
。
或者断言非罗嗦字符(?<!\w)
和(?!\w)
。
甚至可以使用$1
和$2
将其重新插入到替换文字中。
此外,您的preg_replace看起来像是在循环中使用。使用preg_replace_callback
来检查所有潜在的用户名非常简单:
$string = preg_replace_callback("/(?<!\w)@(\w+)(?!\w)/",
function($m) use ($names) {
list($asis, $name) = $m;
if ($isset($names[$name])) {
return "[URL=....]";
}
else return $asis;
},
$string
);
样式建议:并避免使用大写变量名称。 PHP不是BASIC。