Peki, belirgin easy cevap Tüm (here alınan aşağıdaki regex) herhangi bir bbcode odaklı biçimlendirme olmadan "özeti" sunmaktır
$summary = substr( preg_replace( '|[[\/\!]*?[^\[\]]*?]|si', '', $article ), 0, 200 );
Ancak, açıkça tarif işi sadece bir regex daha fazla ihtiyaç oluyor do. A lexer / çözümleyici hile yapacağını, ama bu orta karmaşık bir konu. Ben bir şey w / gelebilir olmadığını görürsünüz.
EDIT
Burada bir lexer bir oldukça getto versiyonu, ama bu örnek için çalışır. Bu BBCode'u belirteçleri içine bir giriş dizesi dönüştürür.
<?php
class SimpleBBCodeLexer
{
protected
$tokens = array()
, $patterns = array(
self::TOKEN_OPEN_TAG => "/\\[[a-z].*?\\]/"
, self::TOKEN_CLOSE_TAG => "/\\[\\/[a-z].*?\\]/"
);
const TOKEN_TEXT = 'TEXT';
const TOKEN_OPEN_TAG = 'OPEN_TAG';
const TOKEN_CLOSE_TAG = 'CLOSE_TAG';
public function __construct( $input )
{
for ( $i = 0, $l = strlen( $input ); $i < $l; $i++ )
{
$this->processChar( $input{$i} );
}
$this->processChar();
}
protected function processChar( $char=null )
{
static $tokenFragment = '';
$tokenFragment = $this->processTokenFragment( $tokenFragment );
if ( is_null( $char ) )
{
$this->addToken( $tokenFragment );
} else {
$tokenFragment .= $char;
}
}
protected function processTokenFragment( $tokenFragment )
{
foreach ( $this->patterns as $type => $pattern )
{
if ( preg_match( $pattern, $tokenFragment, $matches ) )
{
if ( $matches[0] != $tokenFragment )
{
$this->addToken( substr( $tokenFragment, 0, -( strlen( $matches[0] ) ) ) );
}
$this->addToken( $matches[0], $type );
return '';
}
}
return $tokenFragment;
}
protected function addToken( $token, $type=self::TOKEN_TEXT )
{
$this->tokens[] = array( $type => $token );
}
public function getTokens()
{
return $this->tokens;
}
}
$l = new SimpleBBCodeLexer( 'some [b]sample[/b] bbcode that [i] should [url="http://www.google.com"]support[/url] what [/i] you need.' );
echo '<pre>';
print_r( $l->getTokens() );
echo '</pre>';
Bir sonraki adım, bu belirteçleri üzerinde döngüler ve her türlü karşılaştığında gibi tedbirleri alır bir ayrıştırıcı oluşturmak olacaktır. Belki daha sonra bunu yapmak için zaman gerekecek ...