我想制作检测/验证字符串至少有2个字的函数,每个字至少有2个字母(除了两个字母,它可以包含任何其他字符{没有数字},但我不关心哪个和多少个。)
现在,我不确定是否应该使用正则表达式,或者我可以通过其他方式使用正则表达式。
如果我需要为它制作正则表达式,我也不知道该怎么做,因为我需要检查所有可用的字母。
这是我现在获得的正则表达式[A-Za-z]{2,}(\s[A-Za-z]{2,})
,它至少在每个单词中验证了2个单词和2个字母。
修改: 在重新思考之后,我决定支持大多数语言,因为kr-jp-cn语言与其他语言的工作方式不同。我的主要规则不会让kr-jp-cn字母计为字母而是字母。
EDIT2:
这是我根据@message回答使用的功能。
function validateName($name)
{
if (strcspn($name, '0123456789') == strlen($name)) //return the part of the string that dont contain numbers and check if equal to it length - if it equal than there are no digits - 80% faster than regex.
{
$parts = array_filter(explode(' ',$name)); //should be faster than regex which replace multiple spaces by single one and then explodes.
$partsCount = count($parts);
if ($partsCount >= 2)
{
$counter = 0;
foreach ($parts as $part)
{
preg_match_all('/\pL/u', $part, $matches);
if (count($matches[0]) >= 2)
{
$counter++;
}
}
}
if ($counter == $partsCount)
{
return 'matches';
}
}
return 'doesnt match';
}
感谢您的帮助。
答案 0 :(得分:2)
使用Unicode character properties。
\p{L}
或\p{Letter}
将代码点与任何语言的Letter属性相匹配。 php.net documentation on Unicode character properties
答案 1 :(得分:2)
我也会使用正则表达式
preg_match('/\w{2,}\s+\w{2,}/u', 'word слово');
\w{2,}
匹配单词字符2或更多。
\s+
匹配之间的所有空格
并使用/u
unicode modifier
编辑:
我认为这样的解决方案会有所帮助,但你需要更复杂的东西,比如
$text = preg_replace('/\s+/', ' ', 'word w.s');
$parts = explode(' ', $text, 2);
if (count($parts) < 2) {
throw new \RuntimeException('Should have more than two words');
}
foreach ($parts as $part) {
preg_match_all('/\w/u', $part, $matches);
if (count($matches[0]) < 2) {
throw new \RuntimeException('Should have more than two letters in word');
}
}
答案 2 :(得分:0)
如果您尝试使用字符串中的这些单词,那么正则表达式不是可行的方法。正则表达式不是解析器。我可以看到这样做的最佳方式是explode()和ctype_alpha()的组合。
的内容$prepstring = $string;
//Remove all spaces from the original string and check that everything is a char
if(ctype_alpha(str_replace(array(' '), '', $prepstring))){
//If everything is a char explode your string into an array
explode($string);
if(isset($string[1])){
//Everything checks out, do something here.
}
}