Regex PHP – заменить цвета в имени – но только если они в цвете, а не в названиях компаний

У меня есть несколько возможностей для ввода:

  1. «черно-синяя игрушка» (черные и синие – это цвета) ==> «игрушка»
  2. «серебряная ложка» (серебро – цвет) ==> «ложка»
  3. «черная и декальная система сверла» (заметьте, черный цвет не цвет – это часть фирменного наименования – черный и декодер) ==> «черная и декальная бурильная система»,
  4. «красный автомобиль» (красный цвет) ==> «автомобиль»

Что я хочу сделать

  • замените цвета на «» – но только если это цвет. Так что для № 3 выше я не хочу, чтобы черный был заменен, так как он является частью бренда. После «и» в 3 это не цвет, поэтому я могу сделать вывод, что это часть имени.
  • Теперь вопрос в том, как я это делаю? 🙂
$common_terms_to_replace_for_tag_search = array("green","blue","grey","gray","black","red","silver","maroon","violet","white"); $term = str_replace($common_terms_to_replace_for_tag_search," ",$term); 

Однако выше код работает только для примеров 1, 2, 4, а не для 3. Как обновить обновление кода для работы в таких случаях, как 3 выше? Большое спасибо!

Я бы предложил превратить эти цвета в список регулярных выражений, а затем запустить preg_replace следующим образом:

 <?php $string = 'black toshiba'; $all_color_alternation = "\b(?:green|blue|gr[ea]y|black|red|silver|maroon|violet|white)\b"; $common_terms_to_replace_for_tag_search = array( "/$all_color_alternation\\s+and\\s+$all_color_alternation/i", "/\\bblack(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bblue(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bgr[ea]y(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bred(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bsilver(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bmaroon(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bviolet(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i", "/\\bwhite(?=(?: and $all_color_alternation|\s+(?!and)))(?: and $all_color_alternation)?\\b/i"); $replacement = array(''); echo preg_replace($common_terms_to_replace_for_tag_search, $replacement, $string); ?> 

Я добавил, что игнорирую вариант case, чтобы также удалять имена цветов в верхнем и нижнем регистре.

Первое регулярное выражение сначала удалит все цвета в контексте COLOR+and+COLOR .

См. Пример программы .

Вывод:

 black and white apple ==> apple black and decker drill system ==> black and decker drill system black apple ==> apple gray and black toshiba ==> toshiba