PHP - 检查字符串是否只有少于4个字符的单词

时间:2017-05-06 10:50:37

标签: php regex

我需要检查查询字符串是否仅由少于4个字符的单词组成,如果为真,则删除所有空格。

类似于:this has four character words or higher ......会返回FALSE

类似于:hd 1 kit ...将返回TRUE,因为字符串中的单词不超过3个字符。

我尝试编码,但对于如何为这样的事情写一个正则表达式没有丝毫的线索。

4 个答案:

答案 0 :(得分:3)

希望这个简单的解决方案可以帮助你。

正则表达式: /\b[a-zA-Z0-9]{4,}\b/

  

1。 \b[a-zA-Z0-9]{4,}\b将匹配四个字符,\b代表边界条件。

<?php

$string1="this has four character words or higher";
$string2="hd 1 kit";

if(!preg_match_all("/\b[a-zA-Z0-9]{4,}\b/", $string1))
{
    echo "Should be allowed";
}

答案 1 :(得分:3)

您可以使用@SahilGulati提议的正则表达式执行此操作,但使用explode()可能更有效:

$string = "this has four character words or higher";
$array = explode(" ", $string);
$success = true;
foreach ($array as $word) {
    if(strlen($word) < 4) {
        $success = false;
        break;
    }
}
if($success) {
    echo "ok";
} else {
    echo "nok";
}

这是live example

here是使用正则表达式和非正则表达式的实时比较(不使用正则表达式时快35%):

<?php
function noRegex() {
    $string = "this has four character words or higher";
    $array = explode(" ", $string);
    $success = true;
    foreach ($array as $word) {
        if(strlen($word) < 4) {
            $success = false;
            break;
        }
    }
    return $success;
}
function regex() {
    $string = "this has four character words or higher";
    $success = false;
    if(!preg_match_all("/\b[a-zA-Z0-9]{4}\b/", $string)) {
        $success = true;
    }
    return $success;
}

$before = microtime(true);
for($i=0; $i<2000000; $i++) {
    noRegex();
}
echo "no regex: ";
echo $noRegexTime = microtime(true) - $before;
echo $noRegexTime;
echo "\n";

$before = microtime(true);
for($i=0; $i<2000000; $i++) {
    regex();
}
echo "regex: ";
echo $regexTime = microtime(true) - $before;
echo $regexTime;
echo "\n";

echo "Not using regex is " . round((($regexTime / $noRegexTime) - 1) * 100, 2) . "% faster than using regex.";
?>

答案 2 :(得分:0)

如果字符串中没有标点符号,那么最有效的方法是使用strpos

function checkWordsLenght($string, $limit)
{
    $offset = 0;
    $string .= ' ';

    while(($position = strpos($string, ' ', $offset)) !== false) {
        if (($position - $offset) > $limit) {
            return false;
        }

        $offset = $position + 1;
    }

    return true;
}

这是working demo

答案 3 :(得分:0)

在提供基于正则表达式的解决方案时,重要的是认为答案最好&#34;是最精致的。这意味着提供最准确的结果,当结果准确性达到平局时,性能应该是下一个标准,如果出现这种情况则遵循模式简洁。

出于这个原因,我被迫发布一个优于目前接受的答案的答案。我将使用V_RocKs在ssc-hrep3答案下的注释中使用的变量名。

使用第一个示例字符串的代码:

$query="this has four character words or higher";
$query=preg_match("/[^ ]{4,}/",$query)?str_replace(" ","",$query):$query;
echo "$query";

输出:

thishasfourcharacterwordsorhigher

使用第二个样本字符串的代码:

$query="hd 1 kit";
$query=preg_match("/[^ ]{4,}/",$query)?str_replace(" ","",$query):$query;
echo "$query";

输出:

hd 1 kit

不仅我的正则表达式模式同样准确,它更短更有效(需要更少的步骤)。对于这个问题,边界字符的使用是不必要的,它会对性能产生负面影响近50%。

从模式中删除单词边界后,有几种方法可以定位所需的子字符串。以下模式具有完全相同的含义且steps计数:

  • /[a-zA-Z0-9]{4,}/
  • /[a-z0-9]{4,}/i
  • /[a-z\d]{4,}/i
  • /[^ ]{4,}/

我的观点是:读者不会来找SO,因为它已经足够好了#34;答案,他们来到这里,从富有才华和多元化的SO社区的庞大知识基础中汲取鼓舞人心/教育方法。让我们按下每个答案的最佳方法,以便未来的读者可以从我们的见解中学习,并接受所有编码语言所提供的教育。

当在SO上投票/绿色勾选次优模式时,错失了向读者正确教育完成编码任务的最佳方式的机会。