Я делаю сценарий для преобразования некоторых конкретных тегов в известный и действительный 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]
Пожалуйста, предложите, я не знаю много регулярных выражений.
</span>
; включите их в один.[b]
, [i]
и т.д. и использовать хешированную структуру в preg_replace_callback
/
,Попробуйте следующий код:
// 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 );
Используйте не жадный вариант:
$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 );