PHP (preg_replace) 去除非英文的特殊字符

PHP (preg_replace) remove special character not non-english

我正在尝试删除所有特殊字符,例如

()[]{}~`@#$%^&*_+=/|.,،;:?؟><

但是此代码将删除所有规范字符和非英语字符,我只想删除规范字符而不是非英语字符。我的意思是只接受英文+非英文但不接受特殊字符。

preg_replace("/[^A-Za-z0-9\-]/", "-", $_REQUEST["title"]);

作为评论中讨论的结果,这可能会让您入门:

<?php

$subject = "This is a string ()[]{}~`@#$%^&?؟*_+=/|.,،;:' getting stripped.";

$pattern = sprintf('/[%s]/', preg_quote("()[]{}~`@#$%^&?؟*_+=/|.,،;:'", '/'));
$subject = preg_replace($pattern, '', $subject);

echo $subject."\n";

关于 sql 注入预防,您还提到:如问题评论中所述,您必须使用现代数据库适配器(mysqli 或 PDO)和 "prepared statements".你会在文档中找到关于它的解释。其他一切都是 "fixing the problem only a bit" ,这根本没有意义。

使用 unicode 属性:

preg_replace("/[^\p{L}\p{N}]/u", "-", $_REQUEST["title"]);

这将用破折号替换任何不是字母和数字的字符。

根据评论编辑:

$regex = array('/[^\p{L}\p{N}\s]/u', '/\s/');
$repl  = array('', '-');
preg_replace($regex, $repl, $_REQUEST["title"]);