J'essaie de faire correspondre un mot avec une liste de noms de balises dans un tableau en utilisant preg_grep

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat";

$tag = preg_grep('/' . $subBlockTag . '[.]*/i', $tagOptArray);

var_dump($tag);

Cela produit le résultat suivant.

array(1) { [6]=> string(22) "Boat and Ship Building" }

Mais quand $subBlockTag = "Boat Building"; cela retourne un tableau vide qui n'est pas attendu car il doit correspondre avec "Boat and Ship Building" dans le tableau des balises.

MODIFIER

Voici les balises possibles qui peuvent être attribuées pour $subBlockTag

$subBlockTag = "Boat Building";
$subBlockTag = "Ornamental Fish";
$subBlockTag = "Fish";
$subBlockTag = "Fruits and Vegetables";
$subBlockTag = "Diamond and Jewellery";
1
user27 17 janv. 2017 à 13:52

2 réponses

Meilleure réponse

Si vous avez des mots réguliers séparés par des espaces dans $tagOptArray et que vous devez faire correspondre les éléments qui contiennent les mots dans le même ordre, vous pouvez remplacer tous les espaces par .* et utiliser votre approche:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "Boat Building";
$tag = preg_grep('/' .  preg_replace("~\s+~", ".*", trim($subBlockTag)) . '/is', $tagOptArray);
print_r($tag);

Consultez la démo PHP.

Je suggère d'utiliser également trim($subBlockTag) pour éviter d'avoir .* aux positions de tête / de fuite, en particulier en position de leader pour éviter les problèmes de performances. Cela peut être lent si vous avez des textes très longs à gérer.

Pour trouver une correspondance lorsque tous les mots séparés par des espaces sont présents dans la chaîne, vous devez construire une expression régulière avec des anticipations positives ancrées au début:

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building");
$subBlockTag = "building boat";
$tag = preg_grep('/^(?=.*' .  implode(")(?=.*", preg_split("~\s+~", trim($subBlockTag))) . ')/is', $tagOptArray);
print_r($tag);

Voir une autre démo PHP, et voici une démo regex.

0
Wiktor Stribiżew 17 janv. 2017 à 12:31

Joindre les balises avec le caractère regex OR |

$tagOptArray = array("Corporate", "Exporters", "Buyers", "News", "Apparel","Aquarium Fish", "Boat and Ship Building","boat");
$subBlockTag = "Building   Boat";
$tag = preg_grep('/' . preg_replace("~\s+~", "|",$subBlockTag) . '/is', $tagOptArray);
print_r($tag);

Sortie:

Array
(
    [6] => Boat and Ship Building
    [7] => boat
)
0
Toto 17 janv. 2017 à 12:31