簡體   English   中英

PHP-檢查字符串是否只有少於4個字符的單詞

[英]PHP - Check if a string has only words of less than 4 characters

我需要檢查查詢字符串是否僅由少於4個字符的單詞組成,然后刪除所有空白(如果為true)。

像這樣: this has four character words or higher ...會返回FALSE

類似於: hd 1 kit ...將返回TRUE因為字符串中的任何單詞都不能超過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";
}

您可以使用@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";
}

這是一個生動的例子


是使用正則表達式和非正則表達式的實時比較(不使用正則表達式時,速度大約快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.";
?>

如果字符串中沒有標點符號,那么最有效的方法是使用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;
}

這是工作演示

重要的是,在提供基於正則表達式的解決方案時,被認為是“最佳”的答案是最精確的。 這意味着要提供最准確的結果,並且當結果的准確性受到限制時,性能應該成為下一個標准,如果涉及到這一點,則緊隨其后的是模式簡潔。

因此,我不得不發布比當前接受的答案更好的答案。 我將在ssc-hrep3的答案下的注釋中使用V_RocKs使用的變量名。

使用第一個示例字符串的代碼:

$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

我的regex模式不僅同樣准確,而且更短,更有效(所需步驟更少)。 對於這個問題,邊界字符的使用是不必要的,並且會對性能產生近50%的負面影響。

從模式中刪除單詞邊界后,有幾種方法可以將所需的子字符串作為目標。 以下模式的含義和steps數完全相同:

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

我的觀點是:讀者不會來SO尋求“嗯,足夠好”的答案,他們來這里是為了從才華橫溢且多樣化的SO社區的廣泛知識庫中汲取啟發性/教育性方法。 讓我們努力尋求對每個答案的最佳方法,以便將來的讀者可以從我們的見解中學習並接受有關編碼語言必須提供的所有知識的教育。

如果在SO上對次優模式進行了評價/綠色標記,那么就錯過了一次機會來適當地教育讀者關於完成編碼任務的最佳方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM