展开反向正则表达式以允许 1 个空格字符
Posted
技术标签:
【中文标题】展开反向正则表达式以允许 1 个空格字符【英文标题】:Expand inverted regex to allow 1 space character 【发布时间】:2011-07-26 07:45:10 【问题描述】:如何更改下面的模式以允许 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 中存在 2 个空格字符,因此 if 语句应该为 true,replace 函数将更新 $name,因此其值将变为“too longname”。
【问题讨论】:
【参考方案1】:应该就像在括号中添加一个空格一样简单。
$pattern_name = '/[^a-zA-Z ]/';
【讨论】:
否,因为这将禁止字符串中的任何空格。 这篇文章在这里说“”会给你一个空格。 ***.com/questions/559363/matching-a-space-in-regex 我以为我理解倒置正则表达式,但没关系。 这也只匹配一个字符。【参考方案2】:您必须使您的模式更加明确。如果最多可以有一个空格,并且必须用字母包围,那么:
$pattern_name = '/^[a-z]+( [a-z]+)?$/i';
【讨论】:
这匹配第一个空格之后的所有内容,这是不可取的,因为以下替换功能会删除太多。也许我需要有 2 个模式,其中第一个删除除第一个之外的所有其他空格。然后,第二个模式将保持原始发布的状态。 是的,这似乎是这里的问题。您不能对匹配和过滤使用相同的正则表达式。 preg_match 需要/^[\w ]+$/
,过滤需要preg_replace('/^([a-z]+( [a-z]+)?).*?$/s','\1', $name)
。【参考方案3】:
我会反转正则表达式,而不是尝试查找无效字符,而是匹配有效名称(您正在这样做吗?)。这给了我们这个正则表达式:/[a-zA-Z]+ [a-zA-Z]+/
。匹配有效字符,一个空格,然后再匹配多个有效字符。
【讨论】:
以上是关于展开反向正则表达式以允许 1 个空格字符的主要内容,如果未能解决你的问题,请参考以下文章