MEDICAL OFFICE Forum

Forum-Navigation
ForumAktivität

php Listenvariablen

Forum-Breadcrumbs – Du bist hier:ForumÖffentlich: Fragenphp Listenvariablen
Du musst dich anmelden um Beiträge und Themen zu erstellen.

php Listenvariablen

hi, weiß jemand wie man listenvariablen so in einen schönen text verwandelt, dass PHP den verarbeiten kann?

{Diagnosen:Titel:Tagzahl#360:Datum}

(Gibt diagnosen mit Datum aus)

Ziel: ich will frakturen finden in den letzten 12 Monaten für DMP Osteoporose. idealerweise mit datum davor. das ergebnis hiermit ist ganz ok, aber es ist noch nicht sauber formatiert (Umlaute haben teils extra oder kein leerzeichen davor, Klammern fehlen)

{PHP}
$text = "{Diagnosen:Titel:Tagzahl#360:Datum}";

// 1. RTF-Umlaute
$umlaute = array(
    "'E4" => "ä", "'F6" => "ö", "'FC" => "ü",
    "'C4" => "Ä", "'D6" => "Ö", "'DC" => "Ü",
    "'DF" => "ß"
);
$text = strtr($text, $umlaute);

// 2. RTF entfernen
$text = preg_replace('/\\\\[a-zA-Z0-9]+/', ' ', $text);
$text = str_replace(array("{", "}", "\\", "\r", "\n"), " ", $text);

// 3. Spaces normalisieren
$text = preg_replace('/\s+/', ' ', $text);

// 1. Leerzeichen vor Umlauten innerhalb von Wörtern entfernen
$clean = preg_replace('/([a-zA-Z])\s+([äöüÄÖÜ])/', '$1$2', $clean);

// 2. fehlendes Leerzeichen vor Großbuchstaben wieder einfügen
$clean = preg_replace('/([a-zäöü])([A-ZÄÖÜ])/', '$1 $2', $clean);

// 4. Blöcke nach Datum
preg_match_all('/(\d{2}\.\d{2}\.\d{2})(.*?)(?=\d{2}\.\d{2}\.\d{2}|$)/', $text, $blocks);

$treffer = array();

for ($i = 0; $i < count($blocks[0]); $i++) {

    $datum = trim($blocks[1][$i]);
    $block = trim($blocks[2][$i]);

    // nur wenn Fraktur enthalten
    if (stripos($block, "fraktur") !== false) {

        // 👉 nur die eigentliche Fraktur-Diagnose extrahieren
        if (preg_match('/(\[[A-Z]\]\s*)?\([A-Z0-9\.]+\)\s*[^)]*fraktur[^)]*/i', $block, $m)) {

            $clean = $m[0];

            // RTF-Reste entfernen
            $clean = preg_replace('/\b(i0|s22|ow|blend1|rowd|rleft0|rftsWidth2|rwWidth5000|0)\b/', '', $clean);

            // Spaces normalisieren
            $clean = preg_replace('/\s+/', ' ', $clean);

            // 👉 UMLAUT-FIX (gezielt, ohne Nebenwirkungen)
            $clean = preg_replace('/([a-zA-Z])\s+([äöüÄÖÜ])/', '$1$2', $clean);

            $treffer[] = $datum . " " . trim($clean);
        }
    }
}

if (count($treffer) > 0) {
    $treffer = array_unique($treffer);
    echo implode("\n", $treffer);
} else {
    echo "nein";
}
{/PHP}

aus {Diagnosen:Titel:Tagzahl#360:Datum}

Diagnosen: 
23.02.26 (Z92.4) Voroperationen (Hysterektomie 03/21)
09.04.26 [R] (S72.41) Kondyläre Femurfraktur
12.04.26 (I21.9) Herzinfarkt (Stent 02/23)
14.04.26 (S02.9) nachä Mitäte ävor Schädelfraktur äöüßÄÖÜ (in Klammern)

wird das hier

09.04.26 [R] (S72.41) Kondyläre Femurfraktur
14.04.26 (S02.9) nachä Mitäteävor SchädelfrakturäöüßÄÖÜ (in Klammern

(ä sind die leerzeichen verschoben, woanders fehlen klammern am Ende)

 

 

 

Das sagt Claude

Ich sehe die zwei Probleme:
1. Umlaute: Das Regex ([a-zA-Z])\s+([äöüÄÖÜ]) entfernt Leerzeichen vor Umlauten – das frisst aber auch echte Wortgrenzen wie nach ä → nachä
2. Schließende Klammer fehlt: Das Regex für die Fraktur-Diagnose matcht nur bis zum Ende ohne ) zu erfassen
Außerdem ist der Code etwas durcheinander – $clean wird in Schritt 3 verwendet, bevor es definiert ist.

{PHP}
$text = "{Diagnosen:Titel:Tagzahl#360:Datum}";

// 1. RTF-Umlaute dekodieren
$umlaute = array(
    "'E4" => "ä", "'F6" => "ö", "'FC" => "ü",
    "'C4" => "Ä", "'D6" => "Ö", "'DC" => "Ü",
    "'DF" => "ß"
);
$text = strtr($text, $umlaute);

// 2. RTF-Steuerzeichen entfernen
$text = preg_replace('/\\\\[a-zA-Z0-9]+/', ' ', $text);
$text = str_replace(array("{", "}", "\\", "\r", "\n"), " ", $text);

// 3. Spaces normalisieren
$text = preg_replace('/\s+/', ' ', $text);

// 4. Blöcke nach Datum aufteilen
preg_match_all('/(\d{2}\.\d{2}\.\d{2})(.*?)(?=\d{2}\.\d{2}\.\d{2}|$)/', $text, $blocks);

$treffer = array();

for ($i = 0; $i < count($blocks[0]); $i++) {

    $datum = trim($blocks[1][$i]);
    $block = trim($blocks[2][$i]);

    if (stripos($block, "fraktur") === false) continue;

    // Fraktur-Diagnose extrahieren inkl. optionalem [R]/[L] und schließender Klammer
    if (preg_match('/(\[[A-Z]\]\s*)?\([A-Z0-9\.]+\)[^(]*fraktur[^(]*/i', $block, $m)) {

        $clean = trim($m[0]);

        // RTF-Reste entfernen (nur isolierte Tokens)
        $clean = preg_replace('/\b(i0|s22|ow|blend1|rowd|rleft0|rftsWidth2|rwWidth5000|0)\b/', '', $clean);

        // Spaces normalisieren
        $clean = preg_replace('/\s+/', ' ', $clean);

        // Leerzeichen VOR Umlaut nur entfernen, wenn kein Leerzeichen NACH dem vorherigen Buchstaben sinnvoll ist
        // = nur innerhalb zusammengeschriebener Wörter (kein Trennzeichen davor)
        $clean = preg_replace('/([a-zA-ZäöüÄÖÜß])\s+([äöüÄÖÜ][a-z])/u', '$1$2', $clean);

        // Fehlende Leerzeichen zwischen klein→GROSS einfügen (Worttrenner)
        $clean = preg_replace('/([a-zäöüß])([A-ZÄÖÜ])/u', '$1 $2', $clean);

        $treffer[] = $datum . " " . trim($clean);
    }
}

if (count($treffer) > 0) {
    $treffer = array_unique($treffer);
    echo implode("\n", $treffer);
} else {
    echo "nein";
}
{/PHP}

 

{PHP}
$text = „{Diagnosen:Titel:Tagzahl#360:Datum}“;

// 1. RTF-Umlaute dekodieren
$umlaute = array(
„‚E4“ => „ä“, „‚F6“ => „ö“, „‚FC“ => „ü“,
„‚C4“ => „Ä“, „‚D6“ => „Ö“, „‚DC“ => „Ü“,
„‚DF“ => „ß“
);
$text = strtr($text, $umlaute);

// 2. RTF-Steuerzeichen entfernen
$text = preg_replace(‚/\\\\[a-zA-Z0-9]+/‘, ‚ ‚, $text);
$text = str_replace(array(„{„, „}“, „\\“, „\r“, „\n“), “ „, $text);

// 3. Spaces normalisieren
$text = preg_replace(‚/\s+/‘, ‚ ‚, $text);

// 4. Blöcke nach Datum aufteilen
preg_match_all(‚/(\d{2}\.\d{2}\.\d{2})(.*?)(?=\d{2}\.\d{2}\.\d{2}|$)/‘, $text, $blocks);

$treffer = array();

for ($i = 0; $i < count($blocks[0]); $i++) {

$datum = trim($blocks[1][$i]);
$block = trim($blocks[2][$i]);

if (stripos($block, „fraktur“) === false) continue;

// Fraktur-Diagnose extrahieren inkl. optionalem [R]/[L] und schließender Klammer
if (preg_match(‚/(\[[A-Z]\]\s*)?\([A-Z0-9\.]+\)[^(]*fraktur[^(]*/i‘, $block, $m)) {

$clean = trim($m[0]);

// RTF-Reste entfernen (nur isolierte Tokens)
$clean = preg_replace(‚/\b(i0|s22|ow|blend1|rowd|rleft0|rftsWidth2|rwWidth5000|0)\b/‘, “, $clean);

// Spaces normalisieren
$clean = preg_replace(‚/\s+/‘, ‚ ‚, $clean);

// Leerzeichen VOR Umlaut nur entfernen, wenn kein Leerzeichen NACH dem vorherigen Buchstaben sinnvoll ist
// = nur innerhalb zusammengeschriebener Wörter (kein Trennzeichen davor)
$clean = preg_replace(‚/([a-zA-ZäöüÄÖÜß])\s+([äöüÄÖÜ][a-z])/u‘, ‚$1$2‘, $clean);

// Fehlende Leerzeichen zwischen klein→GROSS einfügen (Worttrenner)
$clean = preg_replace(‚/([a-zäöüß])([A-ZÄÖÜ])/u‘, ‚$1 $2‘, $clean);

$treffer[] = $datum . “ “ . trim($clean);
}
}

if (count($treffer) > 0) {
$treffer = array_unique($treffer);
echo implode(„\n“, $treffer);
} else {
echo „nein“;
}
{/PHP}

 

Was geändert wurde:
• Umlaut-Regex präzisiert: ([äöüÄÖÜ][a-z]) statt nur ([äöüÄÖÜ]) – greift nur wenn der Umlaut Teil eines Wortes ist, nicht bei alleinstehenden Buchstaben wie ä am Wortanfang nach Leerzeichen
• Schließende Klammer: Regex jetzt /[^(]*/ statt /[^)]*/ – matcht bis zur nächsten öffnenden Klammer (oder Ende), wodurch ) am Schluss erhalten bleibt
• /u-Flag bei allen Unicode-Regexen ergänzt
• Toter Code (das $clean in Schritt 1–2 vor der Schleife) entfernt

Burkhard Strauß hat auf diesen Beitrag reagiert.
Burkhard Strauß

bei funzt das script gar nicht: Ausgabe ist: nein

Aber jetzt damit:
Habe ich mit google gemacht, chatgpt ist down und cloude hat mich rausgeschmissen, weil ich nicht bezahlen wollte.

Ich habe von PHP null Ahnung.

 

{PHP}
$text = „{Diagnosen:Titel:Tagzahl#360:Datum}“;

// 1. RTF-Umlaute dekodieren
$umlaute = array(
„\’e4“ => „ä“, „\’f6“ => „ö“, „\’fc“ => „ü“,
„\’E4“ => „Ä“, „\’D6“ => „Ö“, „\’DC“ => „Ü“,
„\’df“ => „ß“
);
$text = strtr($text, $umlaute);

// 2. RTF-Steuerzeichen entfernen
$text = preg_replace(‚/\\\\[a-zA-Z0-9]+ ?/‘, ‚ ‚, $text);
$text = str_replace(array(‚{‚, ‚}‘, ‚\\‘, „\r“, „\n“), “, $text);

// 3. Spaces normalisieren
$text = preg_replace(‚/\s+/‘, ‚ ‚, $text);

// 4. Blöcke nach Datum aufteilen
preg_match_all(‚/(\d{2}\.\d{2}\.\d{2})(.*?)(?=\d{2}\.\d{2}\.\d{2}|$)/‘, $text, $blocks);

$treffer = array();

for ($i = 0; $i < count($blocks[0]); $i++) {
$datum = trim($blocks[1][$i]);
$block = trim($blocks[2][$i]);

if (stripos($block, ‚fraktur‘) === false) continue;

// Regex für ICD in Klammern + Text bis Fraktur
if (preg_match(‚/(\[[RL]\]\s*)?(\([A-Z][0-9][A-Z0-9\.]+\))\s*.*?fraktur[a-z]*/i‘, $block, $m)) {
$clean = trim($m[0]);
$clean = preg_replace(‚/\b(i0|s22|ow|blend1|rowd|rleft0|rftsWidth2|rwWidth5000|0)\b/‘, “, $clean);
$clean = preg_replace(‚/([a-zäöüß])([A-ZÄÖÜ])/‘, ‚$1 $2‘, $clean);
$clean = preg_replace(‚/\s+/‘, ‚ ‚, $clean);

$treffer[] = $datum . “ “ . trim($clean);
}
}

// 5. Ausgabe mit Überschrift
if (count($treffer) > 0) {
$treffer = array_unique($treffer);
echo „Diagnosen:\n“; // Hier ist die gewünschte Überschrift
echo implode(„\n“, $treffer);
} else {
echo „nein“;
}
{/PHP}

Ergebnis: