2017-01-12 1 views
0

Ich habe eine Zeichenfolge mit einem Produktnamen erhalten. Diese Zeichenfolge enthält auch Farben.Gibt eine Zeichenfolge von vorher ausgewählten Wörtern aus einer anderen Zeichenfolge mit PHP zurück

Beispiel: "Rote T-Shirt, Weiß, Gelb Stripes schwarze Punkte" ($ Produktname)

Die PHP-Funktion sollte nun alle Farben des T-Shirts in einem String zurück.

Ich glaube, ich weiß, wie man Farbe zurückzukehren, zum Beispiel rot:

if (stripos($productname, 'red') !== false) { 
    return 'red'; 
} 

Wie kann ich eine Zeichenfolge mit allen Farben zurückzukehren (durch Komma getrennt)? In diesem Fall sollte es "rot, weiß, gelb, schwarz" sein. Ich habe eine Liste von 30 verschiedenen Farben.

Kann mir jemand einen Tipp geben?

Danke!

+1

einen regulären Ausdruck erstellen und 'verwenden preg_match_all' –

Antwort

2

Vor allem - Sie müssen wissen, welche Farben zu finden sind.

So, Ihre Farben Array müssen definiert:

$colors = ['red', 'white', 'black', 'yellow', 'green']; 
// create a regexp pattern from this array 
// add `i` flag for turning off case sensistivity 
$colors_regexp = '/(' . implode('|', $colors) . ')/i';  
$matches = []; 
$string = 'Red T-Shirt White Yellow Stripes Black Dots'; 
preg_match_all($colors_regexp, $string, $matches); 
// print_r `$matches` to see the matches: 
echo'<pre>',print_r($matches),'</pre>'; 
// use proper key from `$matches`: 
echo implode(', ', $matches[0]); // `Red, White, Yellow, Black` 

geht weiter - Sie können \b hinzufügen, was bedeutet, word boundary so wie andere Wörter wie whitened oder blackened nicht Ihre regexp übereinstimmen:

preg_match_all(
    '/\b(black|white|red)\b/i', 
    'White or red blackened item', 
    $matches 
); 
// matches[0] shows: `Array([0] => White [1] => red)`, no `black` 
0

Wenn Sie eine foreach-Schleife verwenden können, um zu überprüfen, ob Sie bereits für jede einzelne Farbe gestartet haben:

function check_colour($productname){ 

    $colours = new array("Red", "White", "Yellow", "Black", "Green"); 

    foreach ($colours as $colour) { 
     if (stripos($productname, $colour) !== false) { 
      $output .= $colour.","; 
     } 
    } 
    $out = rtrim($output, ','); 

    return $out 
} 

$productname = "Red T-Shirt White Yellow Stripes Black Dots"; 

echo check_colour($productname); 

ich es in einer Funktion setzen leicht zu rufen sie in der Lage sein, können Sie es auch, dass die Farben sind auch ein Argument:

function check_colour($productname, $colours){ 

    foreach ($colours as $colour) { 
     if (stripos($productname, $colour) !== false) { 
      $output .= $colour.","; 
     } 
    } 
    $out = rtrim($output, ','); 

    return $out 
} 

$productname = "Red T-Shirt White Yellow Stripes Black Dots"; 

$colours = new array("Red", "White", "Yellow", "Black", "Green"); 

echo check_colour($productname); 

EDIT: rtrim() entfernt das letzte Komma

0

Ein anderer Ansatz, da wir ein Array von Farben verwenden, erstellen Sie einfach ein Array von Wörtern aus der Zeichenfolge und finden Sie die Kreuzung (gemeinsame Wörter). Verwenden Sie array_map() auf die Fälle, die gleichen für Fall-Unempfindlichkeit zu machen:

$string = "Red T-Shirt White Yellow Stripes Dots"; 
$colors = array("Red", "White", "Yellow", "Black"); 

$result = array_intersect(array_map('strtolower', $colors), 
          array_map('strtolower', explode(' ', $string))); 

print_r($result); 
//or 
echo implode(', ', $result); 

Dies teilt den String von 1 Raum. Wenn Sie mehrere Leerzeichen, Tabulatoren oder Zeilenumbrüche usw. haben diese anstelle von explode():

preg_split('/\s+/', $string); 
Verwandte Themen