2017-05-06 3 views
1

Ich muss überprüfen, ob eine Abfragezeichenfolge ausschließlich aus Wörtern mit weniger als 4 Zeichen besteht, und dann alle Leerzeichen entfernen, wenn sie wahr ist.PHP - Überprüfen, ob eine Zeichenfolge nur Wörter mit weniger als 4 Zeichen enthält

So wie etwas: this has four character words or higher ... würde wie FALSE

Etwas zurück: hd 1 kit ... würde TRUE wie kein Wort in der Zeichenfolge zurück, größer als 3 Zeichen.

Ich würde versuchen, es zu kodieren, aber habe nicht den leisesten Hinweis darauf, wie man eine Regex für so etwas schreibt.

Antwort

3

Hoffe, dass diese einfache Lösung Ihnen helfen wird.

Regex:/\b[a-zA-Z0-9]{4,}\b/

1.\b[a-zA-Z0-9]{4,}\b werden wird vier Zeichen übereinstimmen und \b für Boundry Zustand ist.

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

Danke, funktionierte perfekt und ich hätte gedacht, warum nicht einfach versuchen, mindestens 1 Wort von 4 Zeichen und True/False davon zu suchen. Danke vielmals! –

+0

Sie können es einfacher machen, wenn Sie denken, dass Sie nur * ein * Wort mit * mindestens * vier Zeichen benötigen. –

+0

@CasimiretHippolyte Ich habe es geändert, weil einer von einem guten Mann auf SO gab mir eine Saite wie diese 'Ich bin Sahil'. Dies hat kein Wort von "4" Zeichen, aber es sollte nicht erlaubt sein. –

3

Sie können mit regex dies tun, wie @SahilGulati vorgeschlagen, aber es ist wahrscheinlich effizienter explode() zu verwenden:

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

hier ein live example ist.


Und here ist ein Live-Vergleich für die Verwendung von Regex und ohne reguläre Ausdrücke (etwa 35% schneller, wenn nicht regex):

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

Ich wählte die Antwort, die ich wählte, weil ich in einer Umgebung mit geringer Auslastung bin, wo die Abfrage bereits in weniger als einer Sekunde verarbeitet wird . Ich bevorzuge weniger Code. Mein Endergebnis: '$ query = (! Preg_match_all ("/\ b [a-zA-Z0-9] {4,} \ b/", $ Abfrage)? Str_replace (" "," ", $ query): $ query); ' –

+0

Diese Lösung berücksichtigt keine Interpunktionszeichen. Mit Regex, einfach nicht berücksichtigen, aber mit explodieren, müssen Sie sie schneiden, denke ich. – sevavietl

+0

Warum würden Sie 'preg_match_all' mit Ihrem Benchmark verwenden? ['return (bool)! preg_match ("/\ b [a-zA-Z0-9] {4}/", $ string);'] (http://sandbox.onlinephpfunctions.com/code/0f733df15dd8c305f716e1daf3cb1f584f0dfeff) und es übertrifft noregex. –

0

Wenn Sie dann nicht Satzzeichen in der Zeichenfolge haben die effizienteste Weg sein wird strpos zu verwenden:

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

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

     $offset = $position + 1; 
    } 

    return true; 
} 

Hier ist working demo.

0

Bei der Bereitstellung von Regex-basierten Lösungen ist es wichtig, dass die als "beste" bewertete Antwort am raffiniertesten ist. Dies bedeutet, dass ein möglichst genaues Ergebnis erzielt wird, und wenn die Genauigkeit der Ergebnisse gleich bleibt, sollte die Leistung das nächste Kriterium sein, gefolgt von der Kürze der Muster, wenn es dazu kommt.

Aus diesem Grund bin ich gezwungen, eine Antwort zu posten, die der derzeit akzeptierten Antwort überlegen ist. Ich werde den Variablennamen verwenden, den V_RocKs in einem Kommentar unter der Antwort von ssc-hrep3 verwendet.

-Code unter Verwendung eines ersten Proben string:

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

Output:

thishasfourcharacterwordsorhigher 

-Code-String zweiten Probe unter Verwendung:

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

Output:

hd 1 kit 

Nicht nur ist mein Regex-Muster gleich genau, es ist kürzer und effizienter (erfordert weniger Schritte). Für diese Frage ist die Verwendung von Grenzzeichen überflüssig und beeinträchtigt die Leistung um fast 50%.

Nach dem Löschen der Wortgrenzen aus dem Muster gibt es mehrere Möglichkeiten, die gewünschten Teilstrings zu targeten. Die folgenden Muster haben genau die gleiche Bedeutung haben und steps Zahl:

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

Mein Punkt ist: Die Leser kommen nicht zu SO auf der Suche von "Meh, es ist gut genug" Antworten, sie kommen hierher, um inspirierende/pädagogische Ansätze aus der riesigen Wissensbasis der talentierten zu ziehen und vielfältige SO-Community. Lassen Sie uns darauf drängen, bei jeder Antwort den bestmöglichen Ansatz zu finden, damit zukünftige Leser von unseren Einsichten lernen und sich über alles, was Programmiersprachen bieten, informieren lassen müssen.

Wenn suboptimale Muster auf SO hochgestuft/markiert werden, gibt es eine verpasste Gelegenheit, den Lesern den richtigen Weg aufzuzeigen, wie sie Codieraufgaben am besten erledigen können.

Verwandte Themen