从PHP中删除字符串中的特殊HTML字符

时间:2013-07-31 13:18:52

标签: php html hash

我发现了很多结果,但由于某些原因,对我来说没有任何作用!我已尝试使用正则表达式preg_replacehtml_entity_decode,但没有好......

我想选择具有哈希标记前缀的单词,例如#WORD,效果很好,但有时候哈希标记会被读作‏#WORD并且它会错过。

实施例: This is a normal #hash_mark but ‏#this_isn't

看起来如下: enter image description here

正则表达式用于选择带有哈希标记前缀'~(?<=\s|^)#[^\s#]++~um'

的单词

在标记为重复的问题中,答案不适用于Unicode文本,如图所示:enter image description here


代码会删除所有特殊字符,包括Unicode文本,只需将&rlm;#替换为普通#

function remove_special_char($sentence){    
    return preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s','',$sentence);                  
}

echo remove_special_char("hello مرحبا привет שלום");

输出:

hello

1 个答案:

答案 0 :(得分:1)

有两个不同的字符special_characters enter image description here

让你看看我发生了什么调查

        var_dump(ord('‏#')); //return ASCII value of this char
        $str1 = 'This is character 226 ‏#';

        $str1v1 = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $str1);

        var_dump(ord('#')); //return ASCII value of second char
        $str2 = "This is character 35 #";

        $str2v1 = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $str2);


        var_dump($str1v1);
        var_dump($str2v1);

        var_dump($str1);
        var_dump($str2);

输出:

int 226
int 35
string 'This is character 226 ' (length=22)
string 'This is character 35 ' (length=21)
string 'This is character 226 â€#' (length=26)
string 'This is character 35 #' (length=22)

也许您或您的最终用户已完成复制和粘贴某处,并且它们包含转换的字符代码,如您所描述的(&rlm;#)。因为它们被渲染成相同的表面并让你感到困惑。

为了逃避这些角色,我在下面一行使用了正则表达式

preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $str1);

正则表达式取自PHP remove special character from string