【问题标题】:PHP remove everything except letters and a hyphen (-)PHP 删除除字母和连字符 (-) 之外的所有内容
【发布时间】:2012-10-24 13:37:47
【问题描述】:

我正在制作一个表单,要求输入用户的名字和姓氏,但我不希望他们输入

$heil4

我希望他们进入

Sheila

我知道如何过滤除字母以外的所有内容,但我知道有些名字可以有

Sheila-McDonald

那么我如何从字符串中删除除字母和连字符之外的所有内容?

【问题讨论】:

  • 你什么时候认识一个名字里有数字的人?
  • 取点(也可能是下划线),但非拉丁字母呢?
  • 向我们展示你现在拥有的东西,这样我们就可以改进它而不是制作全新的东西
  • 歌手 Ke$ha 会讨厌你的网站。

标签: php regex filter


【解决方案1】:

简单使用

$s = preg_replace("/[^a-z-]/i", "", $s);

或者如果你想把一些非ascii字符转成ascii,比如Jean-RémyJean-Remy,那么使用

$s = preg_replace("/[^a-z-]/i", "", iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s)); 

【讨论】:

  • 将非 ascii 字符转换为 ascii 不适用于上述代码
【解决方案2】:

与其一无所有,不如找点乐子。这样一个名称主要由您可以解码的数字组成;p

$name = '$h3il4-McD0nald';

$find    = array(0,1,3,4,5,6,7,'$');
$replace = array('o','l','e','a','s','g','t','s');
$name = str_replace($find,$replace,$name);

//Sheila-McDonald
echo ucfirst(preg_replace('/[^a-z-]/i', '', $name));

【讨论】:

  • 好的,现在当您编辑答案并进行更正时,您得到的代码与我的代码几乎相同:)
  • ok /s 表示单行,这是一个错字,/i 表示不区分大小写,这意味着 AZ 字符集没有用处,所以我把它省略了...... . 谢谢你的反对:)
  • 如果您没有注意到,在您更正了答案后,Downvote 已被删除...另外 >> 一些姓氏以小写字母开头,例如von Schack,此类名称不应大写。
【解决方案3】:

$new = preg_replace('#[^A-Z-]#iu', '', $data);

但不是删除字母(从而修改用户的输入)更好地验证它 如果输入无效,则显示错误。这样用户就会知道他输入的正是你所拥有的值

if(!preg_match('#[A-Z-]#iu', $data)) echo 'invalid';

【讨论】:

  • 你在这里误用了类范围:[A-z] 中的所有在Za 之间的符号(例如[)都不会被替换。跨度>
【解决方案4】:

使用它去除所有非字母数字字符,不包括非拉丁字符和prescribedpunctuation

$strtochange= preg_replace("/[^\s\p{Pd}a-zA-ZÀ-ÿ]/",'',$strtochange);

注意:这会将$heil4 变成heil

【讨论】:

    猜你喜欢
    • 2011-11-08
    • 2011-11-12
    • 2010-10-24
    • 2020-04-05
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2014-03-01
    • 2021-07-11
    相关资源
    最近更新 更多