Конвертировать простые коды в HTML-стили

0

Я создаю скрипт для преобразования некоторых определенных тегов в известный и действительный 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]

Вот код, который я used-

$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]

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

Теги:
preg-replace
preg-replace-callback

2 ответа

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

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

// 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 );
  • 0
    Хорошо, но как я могу передать несколько атрибутов, таких как [link = google.com target = new] Google [/ link]
  • 0
    @RNKushwaha $str = preg_replace( '#\[/link=(\S+) target=([^\]]+)\]#i', '<a href="{$1}" target="_{$2}">', $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 );
  • 0
    Как говорится в сообщении, a [открыто и не закрыто, поэтому мы избегаем этого: $str = preg_replace( '/\[fs=(.*)\](.*)\[\/fs\]/U', '<span style="font-size:$1px">$2</span>', $str );
  • 0
    Спасибо за Ваш ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню