• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

str_replace auch regulären Ausdrücken

Mars@Gera

Mitglied
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);
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]", "</a>", $news_text);
komm jedoch nur dies raus
titel</a>

mfg Marcel
 
PHP:
<?php

$subject = '[url=http://www.example.org/]Title[/url]

Und hier noch ein Link:

[url=http://www.example.org/]Title[/url]';

echo preg_replace('/\[url=([^\]]*)\](.*?)\[\/url\]/',
                  '<a href="$1">$2</a>',
                  $subject);
 
Du Brain ;)
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
 
Zuletzt bearbeitet:
PHP:
preg_match('/^\[url=(.*?)\](.*?)\[\/url\]/', $string_url, $url_url);
print_r($url_url);

Mit preg_match bekommst du alle Treffer in einem Array, wenn du im 3. Parameter eine variable übergibst. Damit kannst du dann weiterarbeiten.
 
Zuletzt bearbeitet:
nein leider nicht, als es handelt sich darum:
Code:
preg_replace('/\[php]*(.*?)\[\/php]/', highlight_string($1), $news_text);
mfg Marcel
 
PHP:
$test = "Das ist ein Test. Hier ist BB-Code: [url=http://www.domain.de]Link[/url] und weiterer Text.";
preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is", $test, $url);
print_r($url);

echo preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/is", $test, highlight_string($url[1]));


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: [url=http://www.domain.de]Link[/url] und weiterer Text.";
$test .= "Das ist ein Test. Hier ist BB-Code: [url=http://www.domain.de]Link[/url] 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;
 
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 = '[url=http://www.example.org/]Title[/url]

Und hier noch ein Link:

[url=http://www.example.org/]Title[/url]';

$foo = new Foo();

echo $foo->render($bbcode);

echo '<h2>Alle Links</h2>';

print_r($foo->getLinks());

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 ;)
PHP:
$news_text = preg_replace('/\[php\](.*?)\[\/php\]/es', 'highlight_string("\1",true)', $news_text);
Als nächstes wäre nur die frage, wie ich darum, für die Ausgabe noch ein <span> || <div> bekomme, aber das ist erstmal nciht so wichtig
 
Als nächstes wäre nur die frage, wie ich darum, für die Ausgabe noch ein <span> || <div> bekomme, aber das ist erstmal nciht so wichtig

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 '<div class="code">' . highlight_string(\$args[1], true) . '</div>';
}[/php]
EOT;



function cb($args)
{
    return '<div class="code">' . highlight_string($args[1], true) . '</div>';
}

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

echo $input;[/noparse]

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
 
Zurück
Oben