Php 展开反向正则表达式以允许1个空格字符

Php 展开反向正则表达式以允许1个空格字符,php,regex,preg-replace,preg-match,regex-negation,Php,Regex,Preg Replace,Preg Match,Regex Negation,如何更改下面的模式以允许1个空格字符 $name = 'too long name'; $pattern_name = '/[^a-zA-Z]/'; if (preg_match($pattern_name,$name)) { // remove any non-letter characters $name = preg_replace($pattern_name,'',$name); $errors['name'] = 'Invalid characters found and re

如何更改下面的模式以允许1个空格字符

$name = 'too long name';
$pattern_name = '/[^a-zA-Z]/';
if (preg_match($pattern_name,$name)) { // remove any non-letter characters
  $name = preg_replace($pattern_name,'',$name);
  $errors['name'] = 'Invalid characters found and removed in name';
}
使用以下任一模式都不起作用:

$pattern_name = '/[^a-zA-Z ?]/';  
$pattern_name = '/[^a-zA-Z] ?/';

预期结果是匹配,因为$name中存在两个空格字符,因此if语句应为true,replace函数将更新$name,使其值变为“太长的名称”。

它应该像在括号中添加空格一样简单

$pattern_name = '/[^a-zA-Z ]/';

你必须使你的模式更加明确。如果最多只能有一个空格,并且必须用字母包围,则:

$pattern_name = '/^[a-z]+( [a-z]+)?$/i';

我将反转正则表达式,而不是尝试查找无效字符,而是匹配有效名称(这就是您正在做的吗?)。这给了我们这个正则表达式:
/[a-zA-Z]+[a-zA-Z]+/
。匹配有效字符,一个空格,然后再匹配多个有效字符。

否,因为这将禁止字符串中的任何空格。这篇文章说,一个“”将为您提供一个空格。我以为我理解倒正则表达式,但没关系。这也只匹配一个字符。这匹配第一个空格后的所有字符,这是不可取的,因为下面的替换函数将删除太多字符。也许我需要有两个模式,第一个模式删除除第一个之外的所有其他空格。第二种模式将保持原来发布的模式。是的,这似乎是这里的问题。不能对匹配和筛选使用相同的正则表达式。您需要
/^[\w]+$/
进行preg_匹配,需要
preg_替换('/^([a-z]+([a-z]+)?).*$/s','\1',$name)
进行筛选。