2014-02-21 23 views
7

Suchen, BB-Code in PHP mit PHPBB3-Funktionen zu analysieren. Ich habe so weit gekommen:BB-Code für PHPBB3 analysieren

<?php 
    include_once("../../forum/includes/functions_content.php"); 

    $text = "[b]bold text here[/b] not bold here"; 
    $uid = $bitfield = $options = ''; 

    echo("parsing"); 
    echo generate_text_for_storage($text, $uid, $bitfield, $options, true, true, true); 
    echo("finished"); 
?> 

aber es parsing Echos aber nicht weiter danach. Ich erwarte, dass die Ausgabe entlang der Linien von:

<b>bold text here</b> not bold here 

Jede Hilfe sehr geschätzt wird!

bearbeiten

Keine Antworten immer noch funktionieren. Ich suche nach einer Standalone PHP-Seite, die gegebene BB-Code-Zeichenfolge in eine HTML-Zeichenfolge mit PHPBB3 BBCode Parser dreht.

+0

versuchen Sie 'generate_text_for_storage' zu ​​einer Var zuweisen, so dass Sie' var_dump' es. Das kann Ihnen zeigen, was passiert – Brainscrewer

+0

@Brain Screwer var_dump zeigt nichts (ich nehme an, es ist auf den Funktionsaufruf fehlgeschlagen) –

+0

vorübergehend hinzufügen einige var Dump/Echo-Zeilen in der Funktion, um zu sehen, wo und warum es scheitert? – naththedeveloper

Antwort

2

die bbcodes Generierung ist ein 2-Schritt-Verfahren, Ihr den ersten Schritt tun (erster Durchgang)

generate_text_for_storage zum Speichern der bbcode in der Datenbank vorgenommen, sein als bbcode gespeichert, weil Sie die bbcode ohne die Notwendigkeit ändern um alte Nachrichten zu reparieren.

Die andere Funktion für die Suche ist

generate_text_for_display

PHPBB hat ein Wiki Dinge wie diese

https://wiki.phpbb.com/Tutorial.Parsing_text

https://wiki.phpbb.com/Generate_text_for_display

Auflistung sind die Seiten Ihrer gesucht haben.

Alternativ können Sie die bbcode seiner Klasse, Code benutzen, die auch

$bbcode = new bbcode(base64_encode($bbcode_bitfield)); 
$bbcode->bbcode_second_pass($post_text, $posts_row['bbcode_uid'], $posts_row['bbcode_bitfield']); 
$post_text = smiley_text($post_text); 
$post_text = censor_text($post_text); 

arbeitet, wird Sie benötigen

für die letzte

Voll Code für die 2 Funktionen zu arbeiten Methode, mit Ausgang

<?php 
ini_set('display_errors', 1); 
define('IN_PHPBB', true); 
$phpbb_root_path = './forum/'; 
$phpEx = "php"; 
include($phpbb_root_path . 'common.' . $phpEx); 
include($phpbb_root_path . 'includes/bbcode.' . $phpEx); 
include($phpbb_root_path . 'includes/functions_display.' . $phpEx); 

// Start session management 
$user->session_begin(); 
$auth->acl($user->data); 
$user->setup('viewforum'); 


$text = "[b]bold text here[/b] not bold here"; 

$uid = $bitfield = $options = ''; 
echo("parsing"); 
echo generate_text_for_storage($text, $uid, $bitfield, $options, true, true, true); 
var_dump($text); 
$text = generate_text_for_display($text, $uid, $bitfield, OPTION_FLAG_BBCODE); 
var_dump($text); 
echo("finished"); 

Welche

parsing 
string '[b:1vhn6cjx]bold text here[/b:1vhn6cjx] not bold here' (length=53) 
array (size=1) 
    0 => int 1 
string '<span style="font-weight: bold">bold text here</span> not bold here' (length=67) 
finished 

bb Codeumwandlung gibt ein 2-Schritt-Verfahren die Flexibilität für Anwender und Poster geben den Blick auf die Post anpassen. Sie müssen den Text zunächst mit der ersten Funktion zu verarbeiten und zu verarbeiten, dann ein zweites Mal die html

+0

Ändern für die Anzeige zu generieren funktioniert auch nicht, auch Ihr alternativer Code funktioniert aus irgendeinem Grund nicht! (Ich kann keine Fehler bekommen!) –

+0

Setzen Sie etwas Arbeitscode in die Antwort mit Anzeigefehlern, so hoffentlich können Sie mehr sehen, wenn Ihrs nicht funktioniert – exussum

+0

@TomGullen irgendein Glück mit diesem? – exussum

0

Eine Möglichkeit, dies selbst zu tun, könnte sein, reguläre Ausdrücke zu verwenden, um die BBCode-Tags zu finden und zu erfassen, was zwischen zwei Tags ist.

Hier ist ein Beispiel mit fett gedruckten Text:

$text = "[b]bold text here[/b] not bold here but still [b]bold here[/b]"; 

$pattern = '/\[b\](.*?)\[\/b\]/i'; 
$replacement = '<b>$1</b>'; 
echo preg_replace($pattern, $replacement, $text); 

Ausgang: <b>bold text here</b> not bold here but still <b>bold here</b>.

Weitere Informationen über preg_replace.

Sie können das *? Token bemerken, um die Erfassung faul und nicht gierig zu machen, also für mehrere Tags in derselben Zeichenfolge arbeiten.

Diese Regexp funktioniert auch (nach einer geringfügigen Änderung) für kursiven Text, unterstrichener Text. Aber Sie müssen einen anderen für Links, Listen oder Bilder schreiben. Sie können die Liste der BB-Code-Tags auf Wikipedia finden: BB Code tags. Auf der gleichen Seite finden Sie Beispiel-HTML-Code für jede Art von Tag, die Ihnen wirklich helfen wird!

Jetzt gibt es PHP BBCode Parsing-Bibliothek. Das spart Ihnen viel Zeit und ist wahrscheinlich leistungsfähiger als die Verwendung von Regexs.

Hier sind zwei Beispiele für Bibliotheken: PECL und PEAR.

+0

Danke, aber ich möchte PHPBBs BB-Code-Parser verwenden, damit ich nicht selbst schreiben muss/halte es aufrecht! –

+1

Auch, wenn Sie diese Version verwendet haben, und ich weiß, es ist nur ein Beispiel, können wir die img-Tag nutzen –

0

Hier ist, wie ich eine funktionierende Version erhaltener Code basiert auf dem geschrieben ...

1) installiert PHPBB3 auf meinem lokalen Webserver ... Dies ist: XAMPP, PHP 5.3.18 auf Windows XP .

2) Überprüft, ob alles funktioniert, indem Sie Foren erstellen und Nachrichten als 'Gast' veröffentlichen.

ok Alles, so weit ...

ich meine index.php-Datei dann bearbeitet ‚include‘ alle Standard ‚PHPBB3‘ Sachen, aber entfernt den gesamten Code-Anzeige.

Ich habe dann Ihren Code aufgenommen und jeden Schritt überprüft.

<?php 
/** 
* 
* @package phpBB3 
* @version $Id$ 
* @copyright (c) 2005 phpBB Group 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License 
* 
*/ 

/** 
* @ignore 
*/ 
define('IN_PHPBB', true); 
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './'; 
$phpEx = substr(strrchr(__FILE__, '.'), 1); 
include($phpbb_root_path . 'common.' . $phpEx); 
include($phpbb_root_path . 'includes/functions_display.' . $phpEx); 

echo '<br />----------------------------------------------<br />'; 
echo "Hello from PHPBB3! Start<br />"; // show starting 

// note that multibyte support is enabled here 
$sampleText = "[b]bold text here[/b] not bold here"; 
var_dump($sampleText . ' : '. __FILE__ . __LINE__); 


$myNormalizeText = utf8_normalize_nfc($sampleText); 

var_dump($myNormalizeText .' : '. __FILE__. __LINE__); 

// variables to hold the parameters for submit_post 
$uid = $bitfield = $options = ''; 

echo("<br />parsing Start<br/>"); 
    generate_text_for_storage($myNormalizeText, $uid, $bitfield, $options, true, true, true); 

    var_dump($myNormalizeText .' :'. __FILE__. __LINE__); 
    var_dump($uid .' :'. __FILE__. __LINE__); 
echo("<br />Parsing finished<br/>"); 

echo "<br />Goodbye from PHPBB3! END"; 
echo '<br />----------------------------------------------<br />'; 
?> 

Ausgang:

---------------------------------------------- 
Hello from PHPBB3! Start 

string '[b]bold text here[/b] not bold here : P:\developer\xampp\htdocs\phpBB3\index.php25' (length=82) 

string '[b]bold text here[/b] not bold here : P:\developer\xampp\htdocs\phpBB3\index.php33' (length=82) 


parsing Start 

string '[b:vkw79dbw]bold text here[/b:vkw79dbw] not bold here :P:\developer\xampp\htdocs\phpBB3\index.php41' (length=99) 

string 'vkw79dbw :P:\developer\xampp\htdocs\phpBB3\index.php42' (length=54) 


Parsing finished 

Goodbye from PHPBB3! END 
------------------------ 

Es scheint, als gefragt zu tun.

+0

Hallo Ryan, es scheint überhaupt nicht für mich arbeiten, auch Ihre Lösung scheint nicht zu setzen HTML aus? –

+0

Oh, ich habe sogar den obigen Code über den Webserver laufen lassen! Es ist die mitgelieferte 'index.php' Datei, die wie oben beschrieben modifiziert wurde! –

0

Dieser Code funktioniert für mich zu bekommen: nicht 100% genau, aber es hilft: Dank https://gist.github.com/neo22s/2584465

, mit kleinen Änderungen

<?php 
$servername = "localhost"; 
$username = "username"; 
$password = "password"; 
$dbname = "myDB"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "SELECT post_id, post_text from phpbb_posts"; //adjust phpbb_ 
$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     $converted_post_text=tohtml($row['post_text']); 
     $post_id=$row['post_id']; 
     $updated_sql="UPDATE phpbb_posts SET post_text='".$converted_post_text."' WHERE post_id='".$post_id."'"; 
     $conn->query($updated_sql); 
     echo $post_id . 'Done '. $converted_post_text; 
     echo '<br>'; 

     sleep(1); 
    } 
} else { 
    echo "0 results"; 
} 
$conn->close(); 





function tohtml($text,$advanced=true,$charset='utf-8'){ 

     //special chars 
     $text = htmlspecialchars($text, ENT_QUOTES,$charset); 

     /** 
     * This array contains the main static bbcode 
     * @var array $basic_bbcode 
     */ 
     $basic_bbcode = array(
           '[b]', '[/b]', 
           '[i]', '[/i]', 
           '[u]', '[/u]', 
           '[s]','[/s]', 
           '[ul]','[/ul]', 
           '[li]', '[/li]', 
           '[ol]', '[/ol]', 
           '[center]', '[/center]', 
           '[left]', '[/left]', 
           '[right]', '[/right]', 
     ); 

     /** 
     * This array contains the main static bbcode's html 
     * @var array $basic_html 
     */ 
     $basic_html = array(
           '<b>', '</b>', 
           '<i>', '</i>', 
           '<u>', '</u>', 
           '<s>', '</s>', 
           '<ul>','</ul>', 
           '<li>','</li>', 
           '<ol>','</ol>', 
           '<div style="text-align: center;">', '</div>', 
           '<div style="text-align: left;">', '</div>', 
           '<div style="text-align: right;">', '</div>', 
     ); 

     /** 
     * 
     * Parses basic bbcode, used str_replace since seems to be the fastest 
     */ 
     $text = str_replace($basic_bbcode, $basic_html, $text); 

     //advanced BBCODE 
     if ($advanced) 
     { 
      /** 
      * This array contains the advanced static bbcode 
      * @var array $advanced_bbcode 
      */ 
      $advanced_bbcode = array(
            '#\[color=([a-zA-Z]*|\#?[0-9a-fA-F]{6})](.+)\[/color\]#Usi', 
            '#\[size=([0-9][0-9]?)](.+)\[/size\]#Usi', 
            '#\[quote](\r\n)?(.+?)\[/quote]#si', 
            '#\[quote=(.*?)](\r\n)?(.+?)\[/quote]#si', 
            '#\[url](.+)\[/url]#Usi', 
            '#\[url=(.+)](.+)\[/url\]#Usi', 
            '#\[email]([\w\.\-][email protected][a-zA-Z0-9\-]+\.?[a-zA-Z0-9\-]*\.\w{1,4})\[/email]#Usi', 
            '#\[email=([\w\.\-][email protected][a-zA-Z0-9\-]+\.?[a-zA-Z0-9\-]*\.\w{1,4})](.+)\[/email]#Usi', 
            '#\[img](.+)\[/img]#Usi', 
            '#\[img=(.+)](.+)\[/img]#Usi', 
            '#\[code](\r\n)?(.+?)(\r\n)?\[/code]#si', 
            '#\[youtube]http://[a-z]{0,3}.youtube.com/watch\?v=([0-9a-zA-Z]{1,11})\[/youtube]#Usi', 
            '#\[youtube]([0-9a-zA-Z]{1,11})\[/youtube]#Usi' 
      ); 

      /** 
      * This array contains the advanced static bbcode's html 
      * @var array $advanced_html 
      */ 
      $advanced_html = array(
            '<span style="color: $1">$2</span>', 
            '<span style="font-size: $1px">$2</span>', 
            "<div class=\"quote\"><span class=\"quoteby\">Disse:</span>\r\n$2</div>", 
            "<div class=\"quote\"><span class=\"quoteby\">Disse <b>$1</b>:</span>\r\n$3</div>", 
            '<a rel="nofollow" target="_blank" href="$1">$1</a>', 
            '<a rel="nofollow" target="_blank" href="$1">$2</a>', 
            '<a href="mailto: $1">$1</a>', 
            '<a href="mailto: $1">$2</a>', 
            '<img src="$1" alt="$1" />', 
            '<img src="$1" alt="$2" />', 
            '<div class="code">$2</div>', 
            '<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>', 
            '<object type="application/x-shockwave-flash" style="width: 450px; height: 366px;" data="http://www.youtube.com/v/$1"><param name="movie" value="http://www.youtube.com/v/$1" /><param name="wmode" value="transparent" /></object>' 
      ); 

      $text = preg_replace($advanced_bbcode, $advanced_html,$text); 
     } 

     //before return convert line breaks to HTML 
     return $text; 

    } 

?>