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

use*_*089 29 php regex string preg-replace

删除特殊字符时遇到问题.我想删除除"()/.% - &"之外的所有特殊字符,因为我将该字符串设置为标题.

我编辑了原始代码(见下图):

preg_replace('/[^a-zA-Z0-9_ -%][().][\/]/s', '', $String);
Run Code Online (Sandbox Code Playgroud)

但这并不是要删除特殊字符,例如:"â€","â€",","等等.

原始代码:(这有效但删除了这些字符:"()/.% - &")

preg_replace('/[^a-zA-Z0-9_ -]/s', '', $String);
Run Code Online (Sandbox Code Playgroud)

Luk*_*ger 52

您的点匹配所有字符.逃避它(以及其他特殊字符),如下所示:

preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $String);
Run Code Online (Sandbox Code Playgroud)

  • 你不需要在字符类中转义`[`,`.`,`(`和`)`. (3认同)
  • 实际上,我故意将连字符移动到角色类的末尾,但你说得对,我没有把它叫出来. (2认同)

Tho*_*ens 13

preg_replace('#[^\w()/.%\-&]#',"",$string);
Run Code Online (Sandbox Code Playgroud)


Fra*_*cke 6

你希望海峡更换,因为性能方面它是便宜,仍然适合您的需要!

$title = str_replace( array( '\'', '"', ',' , ';', '<', '>' ), ' ', $rawtitle);
Run Code Online (Sandbox Code Playgroud)

(除非这完全是关于安全性和 sql 注入,在这种情况下,我宁愿使用 ALLOWED 字符的 POSITIVE 列表......更好的是,坚持使用经过测试的、经过验证的例程。)

顺便说一句,由于 OP 谈到了标题设置:我不会用任何东西替换特殊字符,而是用空格替换。一个肤浅的空间比两个词粘在一起更不是问题......


Ano*_*ose 5

不错的尝试!我想你只需做一些小改动:

  • 转义字符类中的方括号([])(也用[和表示])
  • 转义转义符(\)本身
  • 另外还有一个-特殊的怪癖:如果它在两个字符之间,则表示范围,但如果它在开头或结尾,则表示字面-字符.

你会想要这样的东西:

preg_replace('/[^a-zA-Z0-9_%\[().\]\\/-]/s', '', $String);
Run Code Online (Sandbox Code Playgroud)

如果您想进一步阅读本主题,请参阅http://docs.activestate.com/activeperl/5.10/lib/pods/perlrecharclass.html#special_characters_inside_a_bracketed_character_class.