Требуется, применив строку-иголку needle 'аргентинаманитнегра' к строке-стогу haystack ' Аргентина пр ро Аргентина манит негра бдщ негра ', получить на выходе результат - 'Аргентина манит негра'.
Как элегантнее всего осуществить задуманное, и возможно ли это сделать в один приём через регулярное выражение?
Для обработки полиндрома, вернее наибольшего под-полиндрома, я не представляю как обойтись без приведения строки к нижнему регистру и удалению пробелов, но хотелось бы, да в общем так и нужно по заданию, привести его именно в такой вид.
В регулярных выражениях не сильно силён, вот подумал может это возможно сделать более элегантно, чем сейчас пытаюсь сделать я, вычисляя кучу подстрок, их длины, подстроки с пробелами с разных позиций, их длины и вырезание по-средством mb_substr результирующей строки из позиции и длин ранее определённых строк? :-)
' Аргентина пр ро Аргентина манит негра бдщ негра '
'аргентинаманитнегра'
'Аргентина манит негра'
Получилось нечто страшное... :-( Хотя и работает как нужно, но меня не покидает чувство, что эту функцию можно переписать красиво и элегантно на регулярках.
function format($str, $ndl)
{
$arr = preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
for($i=0,$l=mb_strlen($ndl); isset($arr[$i]); ++$i)
if (($s1 = trim(mb_substr($str, $i))) && mb_substr(mb_strtolower(str_replace(' ', '', $s1)), 0, $l) == $ndl)
for($i=0; isset($s1[$i]); ++$i)
if (($s2 = trim(mb_substr($s1, 0, ($i?-$i:null)))) && mb_strtolower(str_replace(' ', '', $s2)) == $ndl)
return $s2;
elseif (!isset($s1[$i+1]))
return false;
return false;
}
Ну если просто подогнать под условие :
$needle = 'аргентинаманитнегра';
$haystack = ' Аргентина пр ро Аргентина манит негра бдщ негра ';
array_map(function($word)use(&$return , $needle){
$return .= (strrpos($needle , $word) !== false ? $word.' ' : '');
} , array_unique(explode(' ' , mb_strtolower(trim($haystack)))));
echo(ucfirst($return));
Сборка персонального компьютера от Artline: умный выбор для современных пользователей