alexanderkx
@alexanderkx

Как правильно объединить два слова в строке?

Метку регулярных поставил, но моё решение, к сожаление без них (а скорей всего именно они помогут).

Есть строка, в которой надо взять первое слово и к нему присоединить другую часть строки, если такая часть имеется.

Я сделал коряво (да и не работает, как надо):

$ar = ["11g", "12g", "13g", "44r", "11g-gtr", "12g-gr"]; // массив возможных совпадений

$str = "Начало *** 2158** 11g-gtr 174"; // входящая строка

$res = explode(" ", $str); // первое слово

foreach ( $ar as $val ) { // перебираем все возможные совпадения
	$sub = strripos($str, ' '.$val);
	if ($sub != false) {
		$res[0] .= $val; // Если нашли, то объединяем с первым словом [ Начало11g ]
		break;
	}	
}


У меня в результате найдя 11g его и подставляет, хотя в строке 11g-gtr. Можно было бы конечно указать в strripos, чтоб искалось совпадение с пробелами до и по после, тогда всё получится, но искомая фраза может быть и в конце строки. Да и вообще наверно так не решается подобная задача?

Каким образом можно разрешить проблему?
Благодарю.
  • Вопрос задан
  • 510 просмотров
Пригласить эксперта
Ответы на вопрос 2
Exomode
@Exomode
Архитектор ПО
В принципе, твой алгоритм вполне рабочий. Отсортируй массив слов по длине строки, по убыванию от самых длинных до самых коротких, потому что у тебя первым находит любое соответствующее вхождение, которое может быть частью составного вхождения в заданном наборе ("11g" входит в "11g-gtr", соответственно если он в итерации идет первее, его первым и будет заменять).
Ответ написан
Комментировать
Express777
@Express777
А если так:

$ar = ["11g", "12g", "13g", "44r", "11g-gtr", "12g-gr"]; // массив возможных совпадений

$str = "Начало *** 2158** 11g-gtr 174"; // входящая строка

$res = explode(" ", $str); // первое слово

foreach ( $ar as $val ) { // перебираем все возможные совпадения
  $substring = in_array( $val, $res);
  if ($substring ) {
    $res[0] .= $val; // Если нашли, то объединяем с первым словом [ Начало11g ]
    break;
  }	
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽