我试图构建一个标记系统,它运行良好。函数preg_replace()存在问题,它从字符串中删除了不必要的空格。
一个例子是,如果我的字符串是
嘿!
@Yosi
@Ben
空格将被删除,它将变成:
嘿!
@Yosi@Ben
这似乎是因为我在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);
正则表达式去掉任何空格,因为这就是它在('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。