2017-05-06 27 views
1

クエリ文字列が4文字未満の単語で構成されているかどうかを確認してください。 PHP - 文字列の文字数が4文字未満であることを確認してください。

だから何かのように:3つの文字を超える文字列に単語として TRUEを返します... hd 1 kitthis has four character words or higher ...のような FALSE

何かを返します。

私はそれをコーディングしようとしていますが、このようなもののための正規表現を書く方法に少しの手掛かりはありません。

答えて

3

この簡単な解決策があなたを助けてくれることを願っています。

正規表現:/\b[a-zA-Z0-9]{4,}\b/

1.\b[a-zA-Z0-9]{4,}\bは意志の4つの文字と\bにマッチしますboundry条件のためです。 @SahilGulatiが提案されているよう

<?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

ありがとうございました。完璧に働いて、私は思っていたはずです。なぜなら、少なくとも1単語4文字とその真偽を検索してみてはいかがですか?どうもありがとう! –

+0

*少なくとも* 4文字の* 1つの単語だけが必要だと思えば、もっと簡単にすることができます。 –

+0

@CasimiretHippolyte SOの良い人の一人が私にこのような文字列をくれたので、私はそれを変更しました。私はSahilです。これは '4'文字の単語を持っていませんが、許可しないでください。 –

3

あなたは正規表現でこれを行うことができますが、おそらく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

私はクエリがすでに2秒未満で処理されている低使用環境にあるので、私が選んだ答えを選びました。私は少ないコードを好む。 $ str_replace( ""、 ""、$ query):$ str_replace( "preq_match_all("/\ z [A-zA-Z0-9] {4、} \ b/"、$ 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)とそれはノレジクスよりも優れています。 –

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

正規表現ベースのソリューションを提供する場合、「最良」と答えたものが最も洗練されたものであることが重要です。これは、最も正確な結果を提供することを意味し、結果の正確さに繋がりがある場合、パフォーマンスは次の基準になり、それに伴いパターンの簡潔さが求められます。

このため、現在受け入れている回答よりも優れた回答を投稿することを余儀なくされています。私は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に来ていません"meh、it's good enough"の回答、彼らはここに来て、才能のある膨大なナレッジベース多様なSOコミュニティ。将来の読者が私たちの洞察から学び、コーディング言語が提供しなければならないすべてのことについて学ぶことができるように、すべての回答に対して可能な限り最良のアプローチを達成しようとします。

準最適なパターンがSOにグリーンマークされている場合、コーディングタスクを実行する最良の方法について読者に適切な教育をする機会がありません。

関連する問題