我使用PHP。
我的字符串看起来像这个
This is a string-test width åäö and some über+strange characters: _like this?
问题
是否有方法删除非字母数字字符并用空格替换它们?以下是一些非字母数字字符:
我读过很多关于它的文章,但它们不支持其他语言,比如:
preg_replace("/[^A-Za-z0-9 ]/", '', $string);Requirements
发布于 2013-05-07 19:33:29
你可以试试这个:
preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);\p{L}代表所有的字母字符(不管是什么字母)。
\p{N}代表数字。
使用u修饰符,主题字符串的字符被视为unicode字符。
或者这个:
preg_replace('~\P{Xan}++~u', ' ', $string);\p{Xan}包含unicode字母和数字。
\P{Xan}包含所有不是unicode字母和数字的内容。(小心,它也包含空白,您可以在~[^\p{Xan}\s]++~u中保留)
如果您想要一组更具体的允许字母集,则必须将\p{L}替换为unicode表中的范围。
示例:
preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);为什么在这里使用所有格量词(++)?
~\P{Xan}+~u将给出与~\P{Xan}++~u相同的结果。这里的区别是,在第一个引擎记录每个回溯位置(我们不需要),而在第二个引擎没有(就像在一个原子组)。其结果是一个很小的表现利润。
我认为在可能的情况下使用所有格量词和原子群是一种很好的做法。
但是,PCRE regex引擎在明显的情况下(例如:a+b => a++b)会自动使量化器具有所有物,除非PCRE模块已经使用选项PCRE_NO_AUTO_POSSESS进行编译。(http://www.pcre.org/pcre.txt)
关于所有量量词和原子群这里(所有格量词)、这里(原子群)或这里的更多信息
发布于 2013-05-07 19:31:06
你是不是在找\W
类似于:
/[\W_]*/匹配所有非字母数字字符和下划线。
\w匹配所有单词字符(字母表、数字、下划线)
\W匹配\w中没有的任何内容。
因此,\W匹配任何非字母数字字符,并且添加下划线,因为\W不匹配下划线。
编辑:这使您的代码行变成:
preg_replace("/[\W_]*/", ' ', $string);' '意味着所有匹配的字符(不是字母和数字)都将变成空白。
reEDIT:您可能还需要使用另一个preg_replace来删除所有连续空格,并将它们替换为单个空格,否则您将得到以下结果:
This is a string test width and some ber strange characters like this 您可以使用:
preg_replace("/\s+/", ' ', $string);最后,修剪开始和结束空间,如果有的话。
发布于 2013-05-07 19:30:58
我不完全确定您使用的是哪种正则表达式。但是,POSIX允许您表示一个字母类,其中:alpha:表示任何字母字符。
所以试着:
preg_replace("/[^[:alpha:]0-9 ]/", '', $string);实际上,我忘了:alnum:-这让它变得更简单:
preg_replace("/[^[:alnum:] ]/", '', $string);https://stackoverflow.com/questions/16426976
复制相似问题