PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Без описания
Поиск в теме | Версия для печати
LML
Отправлено: 03 Февраля, 2021 - 05:50:56
Новичок
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021
Помог: 1 раз(а)
Приветствую!
Подскажите, пожалуйста, как правильно построить регулярку.
Имеется текстовая строка от 3 и до 25 символов.
В строке
каждый символ раскрашен.
Некоторым символам может быть задан одинаковый цвет.
Например:
CODE (
html ):
скопировать код в буфер обмена
<span style = "color:#bf0d0d;" > Ф</ span ><span style = "color:#bf0d0d;" > о</ span ><span style = "color:#bf0d0d;" > р</ span ><span style = "color:#bf0d0d;" > у</ span ><span style = "color:#bfffff;" > м</ span ><span style = "color:#bfffff;" > ч</ span ><span style = "color:#bf0d0d;" > а</ span ><span style = "color:#bf0ddd;" > н</ span ><span style = "color:#bf0ddd;" > е</ span >
Задача: Объединить все символы одного цвета, идущие подряд, под одним тегом, чтобы сократить длину кода.
Необходимо получить:
CODE (
html ):
скопировать код в буфер обмена
<span style = "color:#bf0d0d;" > Фору</ span ><span style = "color:#bfffff;" > мч</ span ><span style = "color:#bf0d0d;" > а</ span ><span style = "color:#bf0ddd;" > не</ span >
Если цвета всех символов одинаковы (допустим, #bf0d0d) - получить:
Vladimir Kheifets
Отправлено: 03 Февраля, 2021 - 11:23:34
Частый посетитель
Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017
Откуда: Германия, Бавария
Помог: 37 раз(а)
LML пишет: Задача: Объединить все символы одного цвета, идущие подряд, под одним тегом, чтобы сократить длину кода.
Необходимо получить:
CODE (
html ):
скопировать код в буфер обмена
<span style = "color:#bf0d0d;" > Фору</ span ><span style = "color:#bfffff;" > мч</ span ><span style = "color:#bf0d0d;" > а</ span ><span style = "color:#bf0ddd;" > не</ span >
Добрый день!
Если реализовать эту задачу, то такой результ не получится т.к.
символ "a" имеет тот же цвет, что что и символы "Фору".
Результат в Ваше случае будет звучать по французки "Форуа"
Реализовать эту задачу можно без регулярки с помощью
класса DOMDocument или с регуляркойСпойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?
$html = <<<HTML
<span style="color:#bf0d0d;">Ф</span>
<span style="color:#bf0d0d;">о</span>
<span style="color:#bf0d0d;">р</span>
<span style="color:#bf0d0d;">у</span>
<span style="color:#bfffff;">м</span>
<span style="color:#bfffff;">ч</span>
<span style="color:#bf0d0d;">а</span>
<span style="color:#bf0ddd;">н</span>
<span style="color:#bf0ddd;">е</span>
HTML ;
######## HTML parse with DOMDocument ##################
$doc = new DOMDocument( ) ;
$doc -> loadHTML ( '<?xml encoding="utf-8" ?>' . $html ) ;
$searchNode = $doc -> getElementsByTagName ( "span" ) ;
foreach ( $searchNode as $item )
{
$color = substr ( $item -> getAttribute ( "style" ) , 7
,- 1
) ; $buf [ $color ] .= $item -> nodeValue ;
}
echo "<pre>" ;
foreach ( $buf as $color => $value )
{
$color = "#$color ;" ;
echo <<< HTML
< span style= "color:$color " > $value </ span>
HTML;
}
/*
результат
Array
(
[bf0d0d] => Форуа
[bfffff] => мч
[bf0ddd] => не
)
<span style="color:#bf0d0d;">Форуа</span><span style="color:#bfffff;">мч</span><span style="color:#bf0ddd;">не</span>
*/
### с регуляркой #######################
function get_str_between2( $str_begin , $str_end , $html ) {
$html ,
$matches ,
PREG_PATTERN_ORDER) ;
return $matches [ 1] ;
}
$match = get_str_between2( ":" , "<" , $html ) ;
$buf = [ ] ;
foreach ( $match as $item )
{
}
foreach ( $buf as $color => $value )
{
$color = "#$color ;" ;
echo <<< HTML
< span style= "color:$color " > $value </ span>
HTML;
}
/*
результат
Array
(
[0] => #bf0d0d;">Ф
[1] => #bf0d0d;">о
[2] => #bf0d0d;">р
[3] => #bf0d0d;">у
[4] => #bfffff;">м
[5] => #bfffff;">ч
[6] => #bf0d0d;">а
[7] => #bf0ddd;">н
[8] => #bf0ddd;">е
)
Array
(
[bf0d0d] => Форуа
[bfffff] => мч
[bf0ddd] => не
)
<span style="color:#bf0d0d;">Форуа</span><span style="color:#bfffff;">мч</span><span style="color:#bf0ddd;">не</span>
*/
?>
Удачи!(Отредактировано автором: 03 Февраля, 2021 - 11:24:00)
LML
Отправлено: 04 Февраля, 2021 - 02:55:57
Новичок
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2021
Помог: 1 раз(а)
Vladimir Kheifets пишет: Добрый день!
Если реализовать эту задачу, то такой результ не получится т.к.
символ "a" имеет тот же цвет, что что и символы "Фору".
Результат в Ваше случае будет звучать по французки "Форуа"
Реализовать эту задачу можно без регулярки с помощью
класса
DOMDocument или с регуляркой
Спойлер (Отобразить ) PHP:
скопировать код в буфер обмена
<?
$html = <<<HTML
<span style="color:#bf0d0d;">Ф</span>
<span style="color:#bf0d0d;">о</span>
<span style="color:#bf0d0d;">р</span>
<span style="color:#bf0d0d;">у</span>
<span style="color:#bfffff;">м</span>
<span style="color:#bfffff;">ч</span>
<span style="color:#bf0d0d;">а</span>
<span style="color:#bf0ddd;">н</span>
<span style="color:#bf0ddd;">е</span>
HTML ;
######## HTML parse with DOMDocument ##################
$doc = new DOMDocument( ) ;
$doc -> loadHTML ( '<?xml encoding="utf-8" ?>' . $html ) ;
$searchNode = $doc -> getElementsByTagName ( "span" ) ;
foreach ( $searchNode as $item )
{
$color = substr ( $item -> getAttribute ( "style" ) , 7
,- 1
) ; $buf [ $color ] .= $item -> nodeValue ;
}
echo "<pre>" ;
foreach ( $buf as $color => $value )
{
$color = "#$color ;" ;
echo <<< HTML
< span style= "color:$color " > $value </ span>
HTML;
}
/*
результат
Array
(
[bf0d0d] => Форуа
[bfffff] => мч
[bf0ddd] => не
)
<span style="color:#bf0d0d;">Форуа</span><span style="color:#bfffff;">мч</span><span style="color:#bf0ddd;">не</span>
*/
### с регуляркой #######################
function get_str_between2( $str_begin , $str_end , $html ) {
$html ,
$matches ,
PREG_PATTERN_ORDER) ;
return $matches [ 1] ;
}
$match = get_str_between2( ":" , "<" , $html ) ;
$buf = [ ] ;
foreach ( $match as $item )
{
}
foreach ( $buf as $color => $value )
{
$color = "#$color ;" ;
echo <<< HTML
< span style= "color:$color " > $value </ span>
HTML;
}
/*
результат
Array
(
[0] => #bf0d0d;">Ф
[1] => #bf0d0d;">о
[2] => #bf0d0d;">р
[3] => #bf0d0d;">у
[4] => #bfffff;">м
[5] => #bfffff;">ч
[6] => #bf0d0d;">а
[7] => #bf0ddd;">н
[8] => #bf0ddd;">е
)
Array
(
[bf0d0d] => Форуа
[bfffff] => мч
[bf0ddd] => не
)
<span style="color:#bf0d0d;">Форуа</span><span style="color:#bfffff;">мч</span><span style="color:#bf0ddd;">не</span>
*/
?>
Удачи!
Спасибо за помощь! Жаль, что сообщений не хватает нажать "Спасибо" :)
Отрицательный результат - тоже результат.
Я хоть теперь не буду уже с этим заморачиваться.
Столько уже вариантов испробовал, пока не решил у спецов спросить.
Всё-таки надеялся, что у меня просто мозгов не хватает, чтобы решить эту задачу...
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB