рассчитать максимальное расстояние (положение) между двумя парными строками в файле

Я хочу рассчитать максимальное расстояние между двумя строками в файле.

Str1 и str2 могут быть одинаковыми, как max_dist (‘.’, ‘.’, $ Text)

Скажем так: public static function max_dist($str1, $str2, $text)

Текст будет как в википедии, например:

Хотя они явно не анархисты, они организованы по порядку
демократия, воплощающая дух сопротивления, который вдохновил многих
Англоязычные синдикалисты.

Я хочу найти максимальное расстояние между ‘,’ и ‘.’ во всем файле. Обратите внимание, что «,» и «.» повторяются по всему тексту и могут быть найдены в парах или нет.

Пример должен возвращать 125 в качестве расстояния между первой запятой и точкой.

Я разрабатываю следующий код, но он работает только в том случае, если пока нет повторений строк, которые нужно найти:

  public static function max_dist($str1, $str2, $f)
{
$len = strlen($f);
$max_dist = 0;
$pos_a = 0; $pos_b = 1;
while (true) {
$a = strpos($f, $str1, $pos_a);
$b = strpos($f, $str2, $pos_b);

if (!($a && $b)) break;

if ($a == $b)
$b = strpos($f, $str2, $a + 1);

if (!$a || !$b) continue;

//if()
$abs = abs($a - $b);
if ($abs > $max_dist) $max_dist = $abs;

$pos_a = $a + 1;
$pos_b = $b + 1;
}

return $max_dist;
}

Есть идеи? Я нашел функцию strstr.php но у него нет опции смещения


Изменить, чтобы уточнить:

Допустим, текст похож на:

Дом Плантагенетов (1154–1485) был королевским домом всех
Английские короли от Генриха II до Ричарда III, включая Анжевина
короли и дома Ланкастера и Йорка. В добавок к
традиционные судебные, феодальные и военные роли короля,
Plantagenets были обязанности перед царством, которые были подкреплены
сложная система правосудия.

Ваша функция (@bogdan) возвращает максимум из всех, то есть: 246.
Я хочу посчитать максимум всех, но по парам в этом случае должно быть: 139 (judicial, в system.)

0

Решение

Я считаю, что ваша функция слишком сложна. Просто используйте strpos с strrpos:

$string = "Though not explicitly anarchist, they organized by rank and file democracy, embodying a spirit of resistance that has inspired many Anglophone syndicalists.";

function max_dist($needle1, $needle2, $string)
{
$first = strpos($string, $needle1);
$last = strrpos($string, $needle2);

return $last - $first;
}

echo max_dist(',', '.', $string);

Возможно, вам придется поменять параметры и проверить второй раз, если . может быть раньше ,, Или использовать abs функция.

Обновить

Если я правильно понимаю. Тогда Вы должны сохранить строку, которая не была обработана:

$string = "The House of Plantagenet (1154–1485) was the royal house of all the English kings from Henry II to Richard III, including the Angevin kings and the houses of Lancaster and York. In addition to the traditional judicial, feudal and military roles of the king, the Plantagenets had duties to the realm that were underpinned by a sophisticated justice system.";

function max_dist($needle1, $needle2, $string)
{
$distances = [];
$string_left = $string;
while (strpos($string_left, $needle1) !== false && strpos($string_left, $needle2) !== false) {
$first = strpos($string_left, $needle1);
$last = strpos($string_left, $needle2);
$distance = abs($last - $first);
$distances[] = $distance;
$offset = max([$first, $last]);
$string_left = substr($string_left, $offset);
}
return $distances;
}

echo max(max_dist(',', '.', $string));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]