如何从字符串中删除特殊字符?

4
我希望能够从字符串的左右两端删除所有非字母数字字符,只保留字符串中间的那些。与此类似的问题我曾在这里询问过,得到了一个好的解决方案:
$str = preg_replace('/^\W*(.*\w)\W*$/', '$1', $str);

但它也会移除一些符号,如ąĄćĆęĘ等,而它不应该,因为它们仍然是字母符号。
上面的例子应该这样做:
~~AAA~~  => AAA (OK)
~~AA*AA~~ => AA*AA (OK)
~~ŚAAÓ~~  => AA (BAD)

当你说非字母数字时,意思是除了A-Za-z0-9之外的任何字符。 - DevZer0
2个回答

4

在使用正则表达式时,请确保使用 u 标志以支持 Unicode。

以下内容适用于您的输入:

$str = preg_replace('/^\W*(.*\w)\W*$/u', '$1', '~~ŚAAÓ~~' );

// str = ŚAAÓ

但这种方法不可行:(不要使用它)
$str = preg_replace('/^\W*(.*\w)\W*$/', '$1', '~~ŚAAÓ~~' );

3
您可以传入一个有效字符列表,并告诉函数将任何不在该列表中的字符替换掉: $str = preg_replace('/[^a-zA-Z0-9*]+/', '', $str);
方括号表示选取此范围内的所有内容。插入符(^)是“非”正则表达式的符号。然后我们列出了有效字符列表(小写字母a到z、大写字母A到Z、数字0到9和星号)。方括号末尾的加号表示选择0个或多个字符。
编辑:
如果这是您想保留的所有字符列表,则可以使用以下代码: $str = preg_replace('/[^ĄąĆ毿ŹźŃńŁłÓó*]+/', '', $str);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接