1

我找到了很多结果,但由于某种原因,对我没有任何作用!我已经尝试过preg_replace使用正则表达式和也html_entity_decode,但没有好...

我想选择带有哈希标记前缀的单词,例如#WORD,它工作得很好,但有时哈希标记被读取为‏#WORD并且它错过了。

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

看起来: 在此处输入图像描述

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


在标记为重复的问题中,答案不适用于 Unicode 文本,如图所示:在此处输入图像描述


该代码确实删除了所有特殊字符,包括 Unicode 文本,只需&rlm;#要用普通字符替换#

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

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

输出:

hello
4

1 回答 1

1

有两个不同的字符special_characters 在此处输入图像描述

让你看看到底发生了什么我做了一些调试

        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 从字符串中删除特殊字符

于 2013-07-31T14:12:08.253 回答