【问题标题】:PHP (preg_replace) remove special character not non-englishPHP(preg_replace)删除非非英语的特殊字符
【发布时间】:2015-05-16 19:39:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以试试here
  • 没有“特殊字符”这样的东西。只有字符。也许有些你不习惯。但这并不完全是一个技术定义。那么您要删除或保留的字符范围是多少?
  • @arkascha 好吧,我想用它来做漂亮的 url,我想至少删除那些不适合 SEO 和 sql 注入等的...比如 ?!&$% ..
  • 所以您无法命名要替换的字符?但你期待答案吗?对不起,我不是想在这里挑剔。只是:没有明确的问题,你如何期待答案?
  • 除此之外:你不能通过它来阻止sql注入。为此,您必须在设置语句时使用“准备好的语句”。其他一切都没有任何意义。你正在尝试的是这样的:好吧,我想把火扑灭。但我不敢看。所以我砍了一棵树。火烧木头。所以当我砍掉那棵树时它可能会死。

标签: php preg-replace


【解决方案1】:

使用 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"]);

【讨论】:

  • 好主意,但它有一个小问题,它适用于英文字符但不适用于非英语。请查看此代码 $title = "سلام"; $output = preg_replace("/[^\p{L}\p{N}]/", "-", $title);回声$输出;在 phptester.net/
  • @Alipour:抱歉,我忘记添加 /u 修饰符。查看我的编辑。
  • 谢谢,我认为这个更适合我的情况,因为它不会让除英语和非英语和编号之外的任何字符,并且不需要定义任何要删除的字符。
  • 是否有机会设置,如果空格将其转换为破折号,否则将其删除。 ?
【解决方案2】:

作为 cmets 讨论的结果,这可能会让你开始:

<?php

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

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

echo $subject."\n";

关于您还提到的 sql 注入预防:如 cmets 中所说,您必须使用现代数据库适配器(mysqli 或 PDO)和“准备好的语句”。您将在文档中找到对此的解释。其他一切都是“只解决一点问题”,这根本没有意义。

【讨论】:

  • 感谢您的回答,效果很好。但看起来它不会删除主题行末尾的 DOT。
  • 哎呀,对不起,忘记了字符集周围的方括号......我稍微改变了答案。
  • 很好的答案 arkascha,非常感谢您的帮助。
  • 很高兴我能帮上忙。但是不要忘记:这不是您的问题的解决方案。在你发现你的问题之前,不可能有一个。不要只停留在解决方案的一部分。以后遇到问题时,您会因此而讨厌自己。
  • 是的,我知道。仍然..还有更多我们没有在替换列表中提到的字符。
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多