str_replace auch regulären Ausdrücken

Hallo, ich bin gerade dabei einen BBCode-tag umzuwandeln, soweit so gut
aus titel
lese ich mittels
[PHP]$string_url = stristr($news_text, „[url=“);
preg_match(‚/^[url=(.?)](.?)[/url]/‘, $string_url, $url_url);[/PHP] aus
jetzt zum ersetzten, da wollte ich einfach das so machen
[PHP]$news_text = str_replace(„[<url“,„<a href='“. $url_url[1] .„' target='_blank'>“. $url_url[2], $news_text);
$news_text = str_replace(„[/url]“, „“, $news_text);
[/PHP]
komm jedoch nur dies raus
[url=http://www.domain.de]titel

mfg Marcel

[php]<?php

$subject = 'Title

Und hier noch ein Link:

Title’;

echo preg_replace(‚/[url=([^]])](.?)[/url]/‘,
$2‘,
$subject);[/php]

Du Brain :wink:
Danke

Edit:
Wenn ich jetzt normal mittels $1 darauf zurückgreifen will, weil ich z.B. dies für eine weiter fkt. brauche geht das ja nciht weil dann Fehlermeldung:

syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or ‚$‘

wie könnte ich noch anderes darauf zugreifen, wenn ich diese noch anderweitig verwenden möchte?

mfg Marcel

[PHP]preg_match(‚/^[url=(.?)](.?)[/url]/‘, $string_url, $url_url);
print_r($url_url);[/PHP]

Mit preg_match bekommst du alle Treffer in einem Array, wenn du im 3. Parameter eine variable übergibst. Damit kannst du dann weiterarbeiten.

nein leider nicht, als es handelt sich darum:

preg_replace('/\[php]*(.*?)\[\/php]/', highlight_string($1), $news_text);mfg Marcel

Hab grad nochmal den Post bearbeitet, da ich es erst falsch verstanden habe :wink:

Habe mein genaues Problem oben nochmal gepostet.

[PHP]$test = „Das ist ein Test. Hier ist BB-Code: Link und weiterer Text.“;
preg_match(„/[url=(.?)](.?)[/url]/is“, $test, $url);
print_r($url);

echo preg_replace(„/[url=(.?)](.?)[/url]/is“, $test, highlight_string($url[1]));
[/PHP]

Wenn du mehrere Vorkommen erwartest, dann arbeite mit preg_match_all und limitiere die Ersetzung bei preg_replace:

[PHP]$test = „Das ist ein Test. Hier ist BB-Code: Link und weiterer Text.“;
$test .= „Das ist ein Test. Hier ist BB-Code: Link und weiterer Text.“;

preg_match_all(„/[url=(.?)](.?)[/url]/is“, $test, $url);

foreach ($url[1] AS $key => $val) {
$test = preg_replace(„/[url=(.?)](.?)[/url]/is“, highlight_string($val), $test, 1);
}

echo $test;[/PHP]

Mit preg_replace_callback fände ich es eleganter.

[php]<?php

class Foo
{
protected $_links = array();

public function cb($args)
{
    list($unused, $url, $title) = $args;

    $this->_links[] = $url;

    return '<a href="' . $url . '">' . $title . '</a>';
}

public function getLinks()
{
    return $this->_links;
}

public function render($input)
{
    $input = preg_replace_callback('/\[url=([^\]]*)\](.*?)\[\/url\]/',
                      array($this, 'cb'),
                      $input);

    return $input;
}

}

$bbcode = 'Title

Und hier noch ein Link:

Title’;

$foo = new Foo();

echo $foo->render($bbcode);

echo ‚

Alle Links

‘;

print_r($foo->getLinks());[/php]

Mars@Gera, vielleicht beschreibst du mal in Worten, was das werden soll.

wie zu sehen war, spielte die funktion highlight_string() eine Rolle.
Ich habe es jetzt :wink:
[PHP]$news_text = preg_replace(‚/[php](.*?)[/php]/es‘, ‚highlight_string(„\1“,true)‘, $news_text);[/PHP]
Als nächstes wäre nur die frage, wie ich darum, für die Ausgabe noch ein ||

bekomme, aber das ist erstmal nciht so wichtig

Alternativen:
[ul]
[li]PHP: BBCode - Manual (PECL-Paket)
[/li][li]HTML_BBCodeParser (PEAR-Paket)
[/li][/ul]

Das ist ein wenig die Schwierigkeit, wenn du in so kleinen Häppchen fragst. Du bekommst für deine Einzelfragen zwar brauchbare Lösungen, die müssen aber nicht unbedingt in der Form erweiterbar sein, die du später benötigst. (Ich weiß, auf der anderen Seite hört man oft „Stell konkrete Fragen!“ – die Wahrheit liegt irgendwo dazwischen, ein etwas größerer Kontext ist aber meist hilfreich. ;))

Bei preg_replace_callback könntest du die entsprechenden HTML-Tags noch mit in die Callback-Funktion setzen.

[code][noparse]<?php

$input = <<<EOT
[php]<?php

function cb($args)
{
return ‚

‘ . highlight_string($args[1], true) . ‚
‘;
}[/php]
EOT;

function cb($args)
{
return ‚

‘ . highlight_string($args[1], true) . ‚
‘;
}

$input = preg_replace_callback(‚/[php](.*?)[/php]/s‘,
‚cb‘,
$input);

echo $input;[/noparse][/code]

Aber crash hat natürlich 'nen Punkt mit dem Verweis darauf, einen bestehenden BBCode-Parser zumindest mal anzuschauen.

Stimmt, wusste gar nicht, das es sowas gibt, danke auf jedenfall schonmal.
Ich muss es komplett drüber bei mir schauen, das ich ein Schönheitsfehler bei mir ntdeckt habe.
Durch „/es“ werden ja neue Zeilen eingefügt, im Code, da ich aber den kompletten String noch durch nl2br() jage, habe ich immer in Code eine Leerzeile.

mfg Marcel