PHP, preg задача на преобразование строки

217
09 апреля 2017, 04:22

Требуется, применив строку-иголку needle 'аргентинаманитнегра' к строке-стогу haystack ' Аргентина пр ро Аргентина манит негра бдщ негра ', получить на выходе результат - 'Аргентина манит негра'.

Как элегантнее всего осуществить задуманное, и возможно ли это сделать в один приём через регулярное выражение?

Для обработки полиндрома, вернее наибольшего под-полиндрома, я не представляю как обойтись без приведения строки к нижнему регистру и удалению пробелов, но хотелось бы, да в общем так и нужно по заданию, привести его именно в такой вид.

В регулярных выражениях не сильно силён, вот подумал может это возможно сделать более элегантно, чем сейчас пытаюсь сделать я, вычисляя кучу подстрок, их длины, подстроки с пробелами с разных позиций, их длины и вырезание по-средством mb_substr результирующей строки из позиции и длин ранее определённых строк? :-)

' Аргентина пр ро Аргентина манит негра бдщ негра '
'аргентинаманитнегра'
'Аргентина манит негра'
Answer 1

Получилось нечто страшное... :-( Хотя и работает как нужно, но меня не покидает чувство, что эту функцию можно переписать красиво и элегантно на регулярках.

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;
}
Answer 2

Ну если просто подогнать под условие :

$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));
READ ALSO
Connect из QVector<QPushButton*>

Connect из QVector<QPushButton*>

Здравствуйте! Пишу игру и столкнулся с одной проблемойУ меня есть 25 кнопок QPushButton в Ui

173
Как удалить нужную часть текста из текстового документа?

Как удалить нужную часть текста из текстового документа?

Допустим, я записал некоторую структуру в текстовый файл с помощью fwrite, например, 20 заводовКак я могу удалить нужные мне заводы? Можно ли стереть...

315
Виртуальное наследование

Виртуальное наследование

VS2015Код упростил

187