У меня например есть строка
s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"
Мне нужно разделить с помощью выражений, а именно функцией string.gmatch, на массив который будет вмещать в себе масивы с цвета R, G, B и самой строки. То есть чтобы в результате я получил массив:
arr[1] = {0, 0, 0, "Hello, world! "}
// Из-за того что в начале строки нет кода цвета, то по умолчанию ставить цвет по нулям
arr[2] = {255, 0, 0, "Привет, мир! "}
arr[3] = {155, 55, 0, "How are {100,3,5you?"}
// "How are {100,3,5you?" - именно так, по скольку неправильно сформирован код цвета, также если будет например буква внутри {100,3Я,5}, то это также все пойдет в строку
Вот что у меня получилось написать на LUA:
arr = {}
s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"
for k, v in string.gmatch(s, "{(%d+,%d+,%d+)}([^{]*)") do
local r, g, b = string.match(k, "(%d+),(%d+),(%d+)")
table.insert(arr, {r, g, b, v})
end
В результате получаю массив:
arr[1] = {255, 0, 0, "Привет, мир! "}
arr[2] = {155, 55, 0, "How are "}
Но меня это не устраивает:
1) нет части строки, в которой не указан цвет, то есть нет массива
arr[1] = {0, 0, 0, "Hello, world! "}
2) Обрезает до следующего символа {
, а нужно чтобы обрезало до комбинации цвета
Как по-другому это реализовать (но в простом варианте, то есть так, чтобы не было большой нагрузки), или хотя бы как например такое реализовать в PHP, а я бы попытался уже как-то перевести на LUA
// TEXT
$text = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?";
// PARSE
preg_match_all("#{(\d+,\d+,\d+)}#Uu", $text, $matches, PREG_OFFSET_CAPTURE|PREG_SET_ORDER);
// VAR
$result = [];
$color = '0,0,0';
$offset = 0;
// EACH
foreach ($matches as $key => $value) {
$text_sub = substr($text, $offset, ($value[0][1] - $offset));
if (mb_strlen($text_sub) > 0) {
$result[] = array_merge(explode(',', $color), [$text_sub]);
}
$offset = $value[0][1] + mb_strlen($value[0][0]);
$color = $value[1][0];
}
// LAST
$text_sub = substr($text, $offset);
if (mb_strlen($text_sub) > 0) {
$result[] = array_merge(explode(',', $color), [$text_sub]);
}
var_dump($result);
Может и костыльно, но то что вам нужно, делает.
Может кто-то знает как по другому это реализовать (но в простом варианте, тоесть так чтобы не было большой нагрузки), или хотя бы как например такое реализовать в PHP
Вот такая реализация:
$s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?";
$res = [];
// Делим предложение
$words = explode(" {", $s);
foreach($words as $k => $w){
// цвета R, G, B
preg_match('/(\d+,\d+,\d+)\}?/', $w, $match);
if(!empty($match)){
// Только текст без цветов R, G, B
preg_match('/[^(\d+,\d+,\d+)\}?].+/', $w, $not_m);
$res[] = [$match[1], $not_m[0]];
}else{
$res[] = ['0,0,0', $w];
}
}
print_r($res);
Получаем результат:
Array
(
[0] => Array
(
[0] => 0,0,0
[1] => Hello, world!
)
[1] => Array
(
[0] => 255,0,0
[1] => Привет, мир!
)
[2] => Array
(
[0] => 155,55,0
[1] => How are
)
[3] => Array
(
[0] => 100,3,5
[1] => you?
)
)
Вот вам вариант без циклов:
$text = '{100,0,0}Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?';
$str = array_filter(preg_split('~{(\d+),(\d+),(\d+)}~', $text));
preg_match_all('~(.+?){~', $text, $matches, PREG_SET_ORDER);
$result = array_map(function ($x, $y) {
return (!preg_match_all('/(\d+),(\d+),(\d+)/', $x[0], $match))
? [0, 0, 0, $y]
: [$match[1][0], $match[2][0], $match[3][0], $y];
}, $matches, $str);
print_r($result);
Вот примерно так получилось:
s = "Hello, world! {255,0,0}Привет, мир! {155,55,0}How are {100,3,5you?"
s = s .. "\n" -- вынужденная мера, обозначим конец строки
arr = {}
local arr = {{0,0,0,""}}
local i=1
for case in s:gmatch ("(.-[%c}])") do
-- print ( case )
local text = case:match("(.+){")
local r, g, b = case:match( "{(%d+),(%d+),(%d+)}")
if r and g and b then
arr[i+1] = {r,g,b,""}
else
text = case
end
arr[i][4] = text
i=i+1
end
-- test
for k,v in pairs(arr) do
print(k, v[1], v[2], v[3], v[4])
end
результат:
1 0 0 0 Hello, world!
2 255 0 0 Привет, мир!
3 155 55 0 How are {100,3,5you?
Как меняется крипторынок и к чему готовиться владельцам криптообменников
Сегодня я столкнулся с проблемойЯ загружаю на свой сайт картинку, процесс сохранения работает исправно
В случае успеха происходит процесс авторизации (создание необходимых связей cookies + session + db)Обратите внимание, что в db тоже должна быть связь...
Подскажите, как сделать на сайте музыку, что-бы не пропадала при обновлении страницы(как в социальных сетях)??