2017-05-06 58 views
1

我需要檢查,如果查詢字符串是小於4個字符的話由純粹,然後刪除所有的空格,如果它是真實的話。PHP - 檢查字符串只有不到4個字符

因此,像:this has four character words or higher ...將返回FALSE

喜歡的東西:hd 1 kit ...將返回TRUE爲字符串中沒有的字超過3個字符。

我想嘗試編碼,但還沒有關於如何寫一個正則表達式這樣的事情絲毫線索。

回答

3

希望這個簡單的解決方案將幫助你。

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

1.\b[a-zA-Z0-9]{4,}\b將匹配將四個字符和\b爲boundry條件。

<?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"; 
} 
+0

謝謝,非常完美,我應該想到,爲什麼不嘗試搜索的4個字符和真/假關閉的至少1個字。非常感謝! –

+0

如果您認爲只需要*一個*字,並且至少有*四個字符,則可以使其更簡單。 –

+0

@CasimiretHippolyte我改變了它,因爲在SO上的一個好人給了我一個像這樣的字符串'我是Sahil'。這不會有'4'字一個字,但它應該被禁止.. –

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."; 
?> 
+0

我選擇我選擇,因爲我在這裏查詢已經變得在不到一秒鐘處理的低使用環境的答案。我更喜歡更少的代碼。我的最終結果是:'$ query =(!preg_match_all(「/ \ b [a-zA-Z0-9] {4,} \ b /」,$ query)?str_replace(「」,「」,$ query): $ query);' –

+0

該解決方案不考慮標點符號。有了正則表達式,你根本不會考慮它們,但是在爆炸的情況下,我想你需要修剪它們。 – sevavietl

+0

你爲什麼要在你的基準測試中使用'preg_match_all'? ['return(bool)!preg_match(「/ \ b [a-zA-Z0-9] {4} /」,$ string);'](http://sandbox.onlinephpfunctions.com/code/0f733df15dd8c305f716e1daf3cb1f584f0dfeff)和它優於noregex。 –

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

0

重要的是,提供基於正則表達式的解決方案時,這個答案被認爲是「最好的」是最精緻的。這意味着提供最準確的結果,並且當結果準確性相關時,性能應該成爲下一個標準,如果涉及到這一點,則應遵循模式簡潔性。

出於這個原因,我不得不發佈一個答案,它優於目前公認的答案。我將在ssc-hrep3的答案下使用V_RocKs在註釋中使用的變量名稱。

代碼使用第一樣本串:

$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"; 

輸出::

hd 1 kit 
使用第二樣本串

thishasfourcharacterwordsorhigher 

代碼

不僅是我正則表達式模式同樣準確,它是較短的,更有效的(需要更少的步驟)。對於這個問題,使用邊界字符是沒有必要的,它對性能的影響將近50%。

從模式掉落字邊界後,有幾種方法可以針對所需的子字符串。下面的模式有相同的意義和steps計數:

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

我的觀點是:讀者不搜索,這樣來「這就夠了」的答案,他們來到這裏從廣闊的知識基礎中吸取有啓發性的教育方法和多樣的SO社區。讓我們按下,在每一個答案上達到最好的方法,以便將來的讀者可以從我們的見解中學習,並接受所有編碼語言必須提供的教育。

當次優模式upvoted /綠色打勾如此,還有一個錯失的機會,以適當地教育讀者,以完成編碼任務的最佳方式。