138701
Goto Top

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);}

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 :/

Content-Key: 578472

Url: https://administrator.de/contentid/578472

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: 144260
144260 11.06.2020 aktualisiert um 11:23:15 Uhr
Goto Top
'< 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
Mitglied: 138701
138701 11.06.2020 um 11:21:13 Uhr
Goto Top
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.
Mitglied: 138701
138701 11.06.2020 um 11:22:33 Uhr
Goto Top
$msg ist vorher als globale Variable markiert worden mit
global $msg;
...
Mitglied: 144260
144260 11.06.2020 aktualisiert um 11:34:07 Uhr
Goto Top
Zitat von @138701:

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.
Nein glaube nicht jedem und allem vor allem ist die Antwort 13 Jahre alt, guckst du:
https://tio.run/##LYxLCoAgEED3nmIIQYVAWttn0xHah8SQQtQwTue3gtbvQ4lq7SdKpH ...
Mitglied: 144260
144260 11.06.2020 aktualisiert um 11:32:43 Uhr
Goto Top
Zitat von @138701:

$msg ist vorher als globale Variable markiert worden mit
global $msg;
Schlechter Stil, bau da besser einen zusätzlichen Parameter ein, so was führt häufig zu Missverständnissen und ist fehlerträchtig.
Mitglied: 138701
138701 11.06.2020 um 11:32:35 Uhr
Goto Top
Ich konnte es jetzt so lösen:
$subs = array(
    '#(\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/)))#'=>'<a href="$1">link</a>',   
    '#\*\*([^*]+)\*\*#'=>'<b>$1</b>',   
    '#\*([^*]+)\*#'=>'<i>$1</i>',   
    '#\~\~([^*]+)\~\~#'=>'<s>$1</s>',   
    '#\_\_([^*]+)\_\_#'=>'<u>$1</u>'  
);
$msg = preg_replace(array_keys($subs), array_values($subs), $msg);
Mitglied: 138701
138701 11.06.2020 um 11:33:27 Uhr
Goto Top
Ich benutze es oft und habe nie Fehler ^^...
Mitglied: 144260
144260 11.06.2020 aktualisiert um 11:44:45 Uhr
Goto Top
Zitat von @138701:

Ich benutze es oft und habe nie Fehler ^^...
Dann hast du wohl noch nie im Team arbeiten müssen face-wink. 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 face-smile.