[img]https://sun9-58.userapi.com/impg/OGT3aYYThqjfZ3gnVOX3a0l2kFguyTwE9kcQ6w/bmPAy_E5rHs.jpg?size=1010x1011&quality=96&sign=1e57b8efd8b03a0057f731f115693cd2&type=album[/img]
[spoiler]тут весь контент после второго изображения[/spoiler]
if (preg_match("#^(.*?\[img\][^\[\]\s]*\[/img\].*?\[img\][^\[\]\s]*\[/img\])(.+)$#si", $str, $r)) {
$str = "{$r[1]}[spoiler]{$r[2]}[/spoiler]";
die($str);
}
AND !preg_match("#^[\s\r\n]*$#s", $r[2])
function spoilerToMsg($text){
# Проверим на наличие спойлера в тексте сообщения (возможно юзер убрал картинки под спойлер самостоятельно
if (!preg_match("!\[spoiler(.*?)](.*?)\[/spoiler\]!si",$text ,$a))
{
# Спойлер не обнаружен, проверим содержимое на наличие картинок в тексте.
# Если их более трех, то все картинки после третьей убираем под спойлер
if (preg_match("#^(.*?\[img\][^\[\]\s]*\[/img\].*?\[img\][^\[\]\s]*\[/img\].*?\[img\][^\[\]\s]*\[/img\])(.+)$#si", $text, $r) AND !preg_match("#^[\s\r\n]*$#s", $r[2])) {
# Посчитаем количество всего изображений
preg_match_all("!\[img](.*?)\[/img\]!si",$text ,$match);
$countImg = count($match[1]);
# Если их больше четырех, то прячем под спойлер, если 4, то одну картинку отдельно в спойлер не выносим!
if($countImg > 4){
$text = "{$r[1]}[spoiler title=\"Остальной контент здесь\"]{$r[2]}[/spoiler]";
}
}
}else{
# Если спойлер в тексте есть, нужно проверить есть ли в нем содержимое, если содержимого нет, то проверим текст далее
# Возможно спойлер был пустой, а далее идут изображения
if(!$a[2]){
if (preg_match("#^(.*?\[img\][^\[\]\s]*\[/img\].*?\[img\][^\[\]\s]*\[/img\].*?\[img\][^\[\]\s]*\[/img\])(.+)$#si", $text, $r) AND !preg_match("#^[\s\r\n]*$#s", $r[2])) {
preg_match_all("!\[img](.*?)\[/img\]!si",$text ,$match);
$countImg = count($match[1]);
if($countImg > 4){
$text = "{$r[1]}[spoiler title=\"Остальной контент здесь\"]{$r[2]}[/spoiler]";
}
}
}
}
return $text;
}
function spoilerToMsg(string $text, int $limit = 2): string
{
$innerLimit = 2 * $limit;
/*
* тут у нас совпадение: из-за того, что нумерация внутри массива идёт с 0,
* индекс последней части равен $innerLimit
*/
$lastIndex = $innerLimit;
/*
* по умолчанию поиск не жадный
*/
$pattern = '#(' . preg_quote('[img]', '#') . '.*' . preg_quote('[/img]', '#') . ')#uU';
$parts = preg_split($pattern, $text, $limit+1, PREG_SPLIT_DELIM_CAPTURE);
if (
count($parts) > $innerLimit
&& strpos($parts[$lastIndex], '[img]') !== false
// не очень правильно, надо бы именно обёрнутость проверять
&& strpos($parts[$lastIndex], '[/spoiler]') === false)
{
$parts[$lastIndex] = '[spoiler title="Остальной контент здесь"]' . $parts[$lastIndex] . '[/spoiler]';
}
return implode('', $parts);
}
$limit = 4
, а $limit+1
меняйте на $limit-1
, вроде... Хотя нет, тогда спойлер криво закроется. Надо звать Михаил Ливач, он правильно адаптирует свой код. [img]...[/img][img]...[/img] остальное под спойлером: [img]...[/img][img]...[/img][img]...[/img]и ожидать, что получится красиво.
<?php
function spoilerToMsg(string $text, int $limit = 2): string
{
$innerLimit = 2 * $limit;
/*
* тут у нас совпадение: из-за того, что нумерация внутри массива идёт с 0,
* индекс последней части равен $innerLimit
*/
$lastIndex = $innerLimit;
/*
* по умолчанию поиск не жадный
*/
$pattern = '#(' . preg_quote('[img]', '#') . '.*' . preg_quote('[/img]', '#') . ')#uU';
$parts = preg_split($pattern, $text, $limit+1, PREG_SPLIT_DELIM_CAPTURE);
echo "limit: {$limit}, parts: ".count($parts)."\n";
if (
count($parts) > $innerLimit
&& strpos($parts[$lastIndex], '[img]') !== false
// не очень правильно, надо бы именно обёрнутость проверять
&& strpos($parts[$lastIndex], '[/spoiler]') === false)
{
$parts[$lastIndex] = '[spoiler title="Остальной контент здесь"]' . $parts[$lastIndex] . '[/spoiler]';
}
return implode('', $parts);
}
$test = '[img]bmPAy_E5rHs.jpg[/img] и ';
$prefix = "Здесь немного текста для начала. ";
for( $limit = 0; $limit < 5; $limit++ ) {
for ( $n = 0; $n < $limit + 3; $n++ ) {
echo "{$n}:\n";
$text = $prefix.str_repeat($test, $n);
echo spoilerToMsg($text, $limit), "\n";
}
echo "\n";
}
echo "done\n";