Preg替换html撇号

时间:2014-03-03 04:06:53

标签: php regex encoding preg-replace

我使用此代码使用户标签和主题标签在我的小网站上运行。

$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&#039;s 

(他&#39; S)

但是,当通过此代码输出时,单词不会被标准化,输出如下:

he&amp;<a class="blue" href="/app/find/search/039">#039</a>;s

什么时候只是&#34;他&#34;&#34; 如何才能将preg替换为撇号?

2 个答案:

答案 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_\-]+))/';

它的作用是,如果标签前面紧跟&,则不匹配。所以&#039;不匹配。同样&#sometag也不会匹配,但我相信这很好,因为如果它前面有一些文本,你已经不匹配主题标签。