138701
11.06.2020, aktualisiert am 05.02.2021
1469
8
0
Preg-replace falsch eingesetzt?
Hallo zusammen,
Ich habe einen Chat programmiert, und in den Nachrichten den Text *wie* hier formatiert. Also zum Beispiel Sternchen.
Mit preg_match_all sah eine Zeile so aus:
function match($string) {global $msg;preg_match_all($string, $msg, $pma);return($pma);}
Um den Code zu kürzen habe ich es weitmöglichst in eine Funktion übergeben:
Und dann fand ich das:
Kommentar von Alexey Lebedev
Er benutzt einen Befehl, wie z.B. substr($rep,1,-1) innerhalb des zu ersetzenden Textes!
Also dachte ich mir, wieso nicht direkt so:
Ich scheine etwas übersehen zu haben, denn es hat nicht funktioniert :/
Ich habe einen Chat programmiert, und in den Nachrichten den Text *wie* hier formatiert. Also zum Beispiel Sternchen.
Mit preg_match_all sah eine Zeile so aus:
function match($string) {global $msg;preg_match_all($string, $msg, $pma);return($pma);}
preg_match_all($string, $msg, $pma);
foreach($pma as $rep) $msg = str_replace($rep, "<i>".substr($rep,1,-1)."</i>", $msg);
Um den Code zu kürzen habe ich es weitmöglichst in eine Funktion übergeben:
function match($string) {global $msg;preg_match_all($string, $msg, $pma);return($pma);}
foreach(match('#\*([^*]+)\*#') as $rep) $msg = str_replace($rep, "<i>".substr($rep,1,-1)."</i>", $msg);
Und dann fand ich das:
Kommentar von Alexey Lebedev
Er benutzt einen Befehl, wie z.B. substr($rep,1,-1) innerhalb des zu ersetzenden Textes!
Also dachte ich mir, wieso nicht direkt so:
preg_replace('#\*([^*]+)\*#', '<i>substr($1,1,-1)</i>', $msg);
Ich scheine etwas übersehen zu haben, denn es hat nicht funktioniert :/
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 578472
Url: https://administrator.de/contentid/578472
Ausgedruckt am: 29.03.2024 um 08:03 Uhr
8 Kommentare
Neuester Kommentar
'< i >substr($1,1,-1)< / i>'
Alles innerhalb von single quoted strings wird als purer "Text" interpretiert, ein Funktionsaufruf funktioniert darin also niemals.
https://www.php.net/manual/en/language.types.string.php
Um den Code zu kürzen habe ich es weitmöglichst in eine Funktion übergeben:
Du übergibst zwar den Pattern an die Funktion aber keinen String für die Variablen $msg in der gematched werden soll, die ist dann immer leer und es kann niemals zu einer Übereinstimmung kommen.Statt mit str_replace kann man auch direkt mit pre_replace_callback() die zurückgegebenen Matches verändern
Zitat von @138701:
Nein glaube nicht jedem und allem vor allem ist die Antwort 13 Jahre alt, guckst du:Alles innerhalb von single quoted strings wird als purer "Text" interpretiert, ein Funktionsaufruf funktioniert darin also niemals.
Das dachte ich mir, aber in seinem Kommentar hat er es angewendet und erzählt, dass es funktioniert. Daher gehe ich davon aus, das es sich bei diesem Befehl um eine Ausnahme handelt.https://tio.run/##LYxLCoAgEED3nmIIQYVAWttn0xHah8SQQtQwTue3gtbvQ4lq7SdKpH ...
Zitat von @138701:
$msg ist vorher als globale Variable markiert worden mit
Schlechter Stil, bau da besser einen zusätzlichen Parameter ein, so was führt häufig zu Missverständnissen und ist fehlerträchtig.$msg ist vorher als globale Variable markiert worden mit
global $msg;
Zitat von @138701:
Ich benutze es oft und habe nie Fehler ^^...
Dann hast du wohl noch nie im Team arbeiten müssen . Universelle Funktionen sollten besser nie von Variablen außerhalb des Function-Scopes abhängen, das fällt einem früher oder später mal auf die Füße. PHP ist kein Batch .Ich benutze es oft und habe nie Fehler ^^...