preg_match(_all),每个空格字符都有一个规则

时间:2011-02-18 14:36:42

标签: php regex

我正在尝试创建一种方法来确保每个空间的每一侧至少包含三个字符(允许使用a-zA-Z和单引号)。它确实如此,但只有第一个空间。不是其他人。我试过preg_match_all()无济于事,因此我的问题/帖子给你们。

<?PHP
  function validateSpaces($str) {
    if ( strpos( $str, ' ' ) !== FALSE && !preg_match( '/(([a-z\']{3,})([ ]{1})([a-z\']{3,}))/i', $str ) )
      return FALSE;

    return TRUE;
  }

  echo validateSpaces( 'Hey There' ); // Valid (correct)
  echo validateSpaces( 'He There' ); // Invalid (correct)
  echo validateSpaces( 'Hey Ther e' ); // Valid (incorrect)
?>

正如您所看到的,前两个示例正如他们应该的那样工作,但第二个示例验证,尽管第二个空格在其右侧只有一个字符。这不是我想要的。

非常感谢任何帮助或尝试提供帮助!

提前谢谢你, 克里斯。

5 个答案:

答案 0 :(得分:3)

最后一次修改,只有在我们只有一个空格(在尝试匹配之前修剪字符串)时才会匹配:

^([a-z']{3,} ?)+$

答案 1 :(得分:2)

你可以在空格上爆炸字符串并检查数组的内容。

不完整的解决方案:

$temb=explode(' ', $str);
$valid=true;
foreach ($temb as $tt) {
  if (strlen($tt)<3 || !{a preg_match for the right characters in $tt}) {
    $valid=false;
    break;
  }
}

答案 2 :(得分:0)

使用preg_match_all()而不是preg_match(),并将结果数与substr_count($ str,'')进行比较,以确定每个空间符合您的正则表达式标准< / p>

答案 3 :(得分:0)

这个怎么样 - 如果表现是一个问题,你可以把模式合二为一;我发现难以阅读多个条件逻辑:

function validate( $value )
{
  $ptn_a = '/(^| )[A-Za-z\']{0,2} /';
  $ptn_b = '/ [A-Za-z\']{0,2}($| )/';

  if ( preg_match( $ptn_a, $value ) )
    return false;

  if ( preg_match( $ptn_b, $value ) )
    return false;

  return true;
}

var_dump( validate('Hey There') );
var_dump( validate('He There') );
var_dump( validate('Hey Ther e') );

答案 4 :(得分:0)

function validate($string = '')


{


  $regexp = '/([^\w]|^)([\w]{1,2})([^\w]|$)/';

  if (strlen(trim($string)) && !preg_match($regexp, $string)) {
      return 'TRUE';
  }

  return 'FALSE';


}


print validate('   ');
print "\n";
print validate('Hey There');
print "\n";
print validate('He There');
print "\n";
print validate('Hey  ');
print "\n";
print validate('Hey Ther e');
print "\n";
print validate('Hey Th ere');

这也有帮助。