我使用此代码使用户标签和主题标签在我的小网站上运行。
$string = $text;
$pattern = '/(^|\W)(@([a-zA-Z0-9_\-]+))/';
$replacement = '$1<a class="blue" href="/app/profile/$3">$2</a>';
$text = preg_replace($pattern, $replacement, $string);
$string = $text;
$pattern = '/(^|\W)(#([a-zA-Z0-9_\-]+))/';
$replacement = '$1<a class="blue" href="/app/find/search/$3">$2</a>';
$text = preg_replace($pattern, $replacement, $string);
echo $text;
我的数据库会保存所有文本:
he's
(他&#39; S)
但是,当通过此代码输出时,单词不会被标准化,输出如下:
he&<a class="blue" href="/app/find/search/039">#039</a>;s
什么时候只是&#34;他&#34;&#34; 如何才能将preg替换为撇号?
答案 0 :(得分:1)
您可以使用后视断言:
/(?<=^|\s)(#|@)(\w+)/
在字符串或空格的开头(包括制表符,换行符等)之前,哈希或符号后跟至少一个“字样”字符。
所以:
$string = preg_replace_callback('/(?<=^|\s)(#|@)(\w+)/', function($match) {
switch ($match[1]) {
case '#':
$format = '<a class="blue href="/app/find/search/%s">%s</a>';
break;
case '@':
$format = '<a class="blue href="/app/profile/%s">%s</a>';
break;
default:
return $match[0];
}
return sprintf($format, urlencode($match[2]), $match[1] . $match[2]);
}, $string);
答案 1 :(得分:0)
将您的第二个模式更改为此。
$pattern = '/(^|[^\w\&])(#([a-zA-Z0-9_\-]+))/';
它的作用是,如果标签前面紧跟&
,则不匹配。所以'
不匹配。同样&#sometag
也不会匹配,但我相信这很好,因为如果它前面有一些文本,你已经不匹配主题标签。