Преобразование простых кодов в HTML-стили

Я делаю сценарий для преобразования некоторых конкретных тегов в известный и действительный HTML-как

[b] bold [/b] for <span style="font-weight:bold"> bold</span>

[color=red] red text [/color] for <span style="font-color:red"> red</span>

[fs=15]big font[/fs] for <span style="font-size:15px"> big font</font>

and [link=http://www.gooole.com target=new title=goole] google[/link] to be converted to

<a href="http://www.gooole.com" title="goole">google</a>

а также может смешивать их, как [fs = 15] это большой. [color = red] красный текст [/ color] [/ fs]

Вот код, который я использовал

$str = preg_replace( '/\[b\]/', '<span style="font-weight:bold">', $str );
$str =preg_replace( '/\[\/b\]/', '</span>', $str );
$str= preg_replace( '/\[\/fs\]/', '</span>', $str );
$str= preg_replace( '/\[fs=(.*)\]/', '<span style="font-size:$1px">', $str );

$str= preg_replace( '/\[\/color\]/', '</span>', $str );
$str= preg_replace( '/\[color=(.*)\]/', '<span style="font-color:$1">', $str );

Этот код работает нормально, если используется не вложенный, а также работает во вложенном, если тег не имеет атрибута =. Проблема возникает, когда я использую что-то вроде этого

[fs=15] this is big. [fs=12] this is big.  [/fs] [/fs]

Это даст мне

<span style="font-size:15] this is big. [fs=12px"> this is big. </span> </span>

в то время как это должно быть

<span style="font-size:15px> this is big. <span style="font-size:12px> this is big. </span> </span>

Работает нормально с

[b] hi [i] ok [/i] yes [/b]

Пожалуйста, предложите, я не знаю много регулярных выражений.

0

Решение

  1. Поскольку вы всегда заменяете закрывающие теги на </span>; включите их в один.
  2. Вы можете использовать отображение хеша для сопоставления похожих структур тегов; лайк [b], [i] и т.д. и использовать хешированную структуру в preg_replace_callback
  3. Используйте несжатое (или ленивое) сопоставление с возможно игнорированием модификатор. Кроме того, используйте другой разделитель, чем /,

Попробуйте следующий код:

// first deal with closing tags
$str = preg_replace( '#\[/(color|b|i|fs|so|many|tags|can|go|here)\]#i', '</span>', $str );
// now some functions; with hashmaps
function colsize( $m ) {
$map = [    // or $map = Array(
'color' => 'color: %s',
'fs' => 'size: %dpx'
];    // or );
return sprintf( '<span style="font-' . $map[$m[1]] . ';">', $m[2] );
}
function emph( $m ) {
$map = [    // or $map = Array(
'b' => 'weight: bold',
'i' => 'style: italic'
];    // or );
return '<span style="font-' . $map[$m[1]] . ';">';
}
// using the custom functions from above now
$str = preg_replace_callback( '@\[(color|fs)=([^\]]+)\]@iU', 'colsize', $str );
$str = preg_replace_callback( '@\[([bi])\]@i', 'emph', $str );
1

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

Используйте не жадный вариант:

$str = preg_replace( '/\[fs=(.*)\]/U', '<span style="font-size:$1px">', $str );

И предпочитаю:

$str = preg_replace( '/\[fs=(.*)\](.*)\[\/fs\]/U', '<span style="font-size:$1px">$2</span>', $str );
1

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