Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-检查字符串是否只有少于4个字符的单词_Php_Regex - Fatal编程技术网

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

PHP-检查字符串是否只有少于4个字符的单词,php,regex,Php,Regex,我需要检查查询字符串是否仅由少于4个字符的单词组成,如果是真的,则删除所有空格 这有四个或更高的字符 ... 将返回FALSE 类似于:hd1套件 ... 将返回TRUE,因为字符串中的单词不超过3个字符 我会尝试对它进行编码,但对于如何为类似的东西编写正则表达式,我一点也不知道。希望这个简单的解决方案能帮助您 正则表达式:/\b[a-zA-Z0-9]{4,}\b/ 一,\b[a-zA-Z0-9]{4,}\b将匹配四个字符,\b表示边界条件 希望这个简单的解决方案能帮到你 正则表达式:/\b[a

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

这有四个或更高的字符 ... 将返回FALSE

类似于:hd1套件 ... 将返回TRUE,因为字符串中的单词不超过3个字符


我会尝试对它进行编码,但对于如何为类似的东西编写正则表达式,我一点也不知道。

希望这个简单的解决方案能帮助您

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

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


希望这个简单的解决方案能帮到你

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

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


您可以使用类似@SahilGulati的正则表达式来实现这一点,但使用explode可能更有效:

这是一本书

这是一个使用正则表达式和非正则表达式的实时比较,在不使用正则表达式的情况下大约快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.";
?>

您可以使用类似@SahilGulati的正则表达式来实现这一点,但使用explode可能更有效:

这是一本书

这是一个使用正则表达式和非正则表达式的实时比较,在不使用正则表达式的情况下大约快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.";
?>

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


以下是。

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


以下是。

在提供基于正则表达式的解决方案时,重要的是,被认为最好的答案是最精确的。这意味着提供最准确的结果,当结果准确度与性能挂钩时,性能应该是下一个标准,如果达到这一标准,模式简洁性应该紧随其后

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

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

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

thishasfourcharacterwordsorhigher
hd 1 kit
使用第二个示例字符串的代码:

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

thishasfourcharacterwordsorhigher
hd 1 kit
我的正则表达式模式不仅同样精确,而且更短、更高效,所需步骤更少。对于这个问题,边界字符的使用是不必要的,它会对性能产生近50%的负面影响

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

/[a-zA-Z0-9]{4,}/ /[a-z0-9]{4,}/i /[a-z\d]{4,}/i /[^ ]{4,}/ 我的观点是:读者来到SO不是为了寻找meh,这是足够好的答案,他们来到这里是为了从才华横溢、多样化的SO社区的广博知识库中汲取启发/教育方法。让我们努力在每个答案上实现最好的方法,以便未来的读者能够从我们的见解中学习,并了解编码语言所提供的一切


当次优模式被向上投票/绿色勾选时,就错失了一个适当教育读者以最佳方式完成编码任务的机会。

在提供基于正则表达式的解决方案时,重要的是,被认为最佳的答案是最精确的。这意味着提供最准确的结果,当结果准确度与性能挂钩时,性能应该是下一个标准,如果达到这一标准,模式简洁性应该紧随其后

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

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

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

thishasfourcharacterwordsorhigher
hd 1 kit
使用第二个示例字符串的代码:

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

thishasfourcharacterwordsorhigher
hd 1 kit
我的正则表达式模式不仅同样精确,而且更短、更高效,所需步骤更少。对于这个问题,边界字符的使用是不必要的,它会对性能产生近50%的负面影响

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

/[a-zA-Z0-9]{4,}/ /[a-z0-9]{4,}/i /[a-z\d]{4,}/i /[^ ]{4,}/ 我的观点是:读者来到SO不是为了寻找meh,这是足够好的答案,他们来到这里是为了从才华横溢、多样化的SO社区的广博知识库中汲取启发/教育方法。让我们努力在每个答案上实现最好的方法,以便未来的读者能够从我们的见解中学习,并了解编码语言所提供的一切


当次优模式被向上投票/绿色勾选时,就错失了一个机会来正确地教育读者如何以最佳方式完成编码任务。

谢谢,工作得很好,我应该想,为什么不尝试搜索至少4个字符的1个单词和t的真/假
帽子非常感谢!如果你认为你只需要一个至少有四个字符的单词,你可以把它变得更简单。@Casimimirithippolyte我改变了它,因为一个好人给了我这样一个字符串,我是Sahil。这没有一个4个字符的单词,但它应该被禁止..我在想:如果!preg_match/\b[a-zA-Z0-9]{4}/,$string1@CasimiretHippolyte是的,这也可能是正确的。。。正确的人谢谢,工作得很好,我应该想,为什么不试着搜索至少一个4个字符的单词,然后去掉其中的真/假。非常感谢!如果你认为你只需要一个至少有四个字符的单词,你可以把它变得更简单。@Casimimirithippolyte我改变了它,因为一个好人给了我这样一个字符串,我是Sahil。这没有一个4个字符的单词,但它应该被禁止..我在想:如果!preg_match/\b[a-zA-Z0-9]{4}/,$string1@CasimiretHippolyte是的,这也可能是正确的。。。正确的人我选择了我选择的答案,因为我处在一个低使用率的环境中,查询已经在不到一秒钟的时间内得到处理。我喜欢更少的代码。我的最终结果:$query=!preg_match_all/\b[a-zA-Z0-9]{4,}\b/,$query?str_replace,,$query:$query;此解决方案不考虑标点符号。对于regex,你根本不考虑它们,但是对于explode,我想你需要修剪它们。为什么你要使用preg_match_来匹配你的基准呢?而且它的性能优于noregex。我使用了与SahilGulatis的答案相同的代码片段。是的,在这个例子中没有考虑标点符号。我选择了我选择的答案,因为我处在一个使用率低的环境中,查询已经在不到一秒钟的时间内得到处理。我喜欢更少的代码。我的最终结果:$query=!preg_match_all/\b[a-zA-Z0-9]{4,}\b/,$query?str_replace,,$query:$query;此解决方案不考虑标点符号。对于regex,你根本不考虑它们,但是对于explode,我想你需要修剪它们。为什么你要使用preg_match_来匹配你的基准呢?而且它的性能优于noregex。我使用了与SahilGulatis的答案相同的代码片段。是的,本例中不考虑标点符号。