php Listenvariablen
Zitat von Burkhard Strauß am 20. April 2026, 15:17 Uhrhi, 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)
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)
Zitat von Peter Quick am 20. April 2026, 15:58 UhrDas 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
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
Zitat von bro am 20. April 2026, 17:17 Uhrbei mir funzt das script gar nicht: Ausgabe ist: nein
ne funzt ja doch: nein bedeutet keine Fraktur, nix BMP
bei mir funzt das script gar nicht: Ausgabe ist: nein
ne funzt ja doch: nein bedeutet keine Fraktur, nix BMP
Zitat von bro am 20. April 2026, 17:24 UhrAber 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}
gelöscht siehe unten
{/PHP}Ergebnis:
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}
gelöscht siehe unten
{/PHP}
Ergebnis:
Zitat von bro am 20. April 2026, 17:53 Uhrauch als Textbaustein:
Final
{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 (TT.MM.JJ)
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;
// Suche ICD in Klammern, gefolgt von Text, dem Wort Fraktur UND allem was danach kommt (.*)
if (preg_match(‚/(\[[RL]\]\s*)?(\([A-Z][0-9][A-Z0-9\.]+\))\s*.*?fraktur.*/i‘, $block, $m)) {
$clean = trim($m[0]);// RTF-Reste entfernen
$clean = preg_replace(‚/\b(i0|s22|ow|blend1|rowd|rleft0|rftsWidth2|rwWidth5000|0)\b/‘, “, $clean);// Wort-Reparatur (klein-GROSS Trennung)
$clean = preg_replace(‚/([a-zäöüß])([A-ZÄÖÜ])/‘, ‚$1 $2‘, $clean);// Finales Säubern der Leerzeichen
$clean = preg_replace(‚/\s+/‘, ‚ ‚, $clean);$treffer[] = $datum . “ “ . trim($clean);
}
}// 5. Ausgabe
if (count($treffer) > 0) {
$treffer = array_unique($treffer);
echo „Frakturen finden in den letzten 12 Monaten für DMP Osteoporose\n“;
echo „Diagnosen:\n“;
echo implode(„\n“, $treffer);
} else {
echo „nein“;
}
{/PHP}
auch als Textbaustein:
Final
{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 (TT.MM.JJ)
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;
// Suche ICD in Klammern, gefolgt von Text, dem Wort Fraktur UND allem was danach kommt (.*)
if (preg_match(‚/(\[[RL]\]\s*)?(\([A-Z][0-9][A-Z0-9\.]+\))\s*.*?fraktur.*/i‘, $block, $m)) {
$clean = trim($m[0]);
// RTF-Reste entfernen
$clean = preg_replace(‚/\b(i0|s22|ow|blend1|rowd|rleft0|rftsWidth2|rwWidth5000|0)\b/‘, “, $clean);
// Wort-Reparatur (klein-GROSS Trennung)
$clean = preg_replace(‚/([a-zäöüß])([A-ZÄÖÜ])/‘, ‚$1 $2‘, $clean);
// Finales Säubern der Leerzeichen
$clean = preg_replace(‚/\s+/‘, ‚ ‚, $clean);
$treffer[] = $datum . “ “ . trim($clean);
}
}
// 5. Ausgabe
if (count($treffer) > 0) {
$treffer = array_unique($treffer);
echo „Frakturen finden in den letzten 12 Monaten für DMP Osteoporose\n“;
echo „Diagnosen:\n“;
echo implode(„\n“, $treffer);
} else {
echo „nein“;
}
{/PHP}
Zitat von Peter Quick am 20. April 2026, 18:34 UhrIch befinde mich zur Zeit auf den Malediven und habe nur kurz versucht, per iPad eine Lösung zu finden. Ich gebe Ihnen recht, dass man das Ergebnis meist noch mal selbst testen muss und dann schauen muss, was rauskommt.
Ohne PC mit MO schwer möglich…
und ich sage mal so, die 17 € pro Monat für Claude lohnen sich für mich regelmäßig. Meinen einfacheren DocCelerate „Nachbau“ habe ich noch vor dem Urlaub fertiggestellt. Sowohl KIM eArztbriefe als auch gescannte Briefe/Faxe werden jetzt per KI verarbeitet, Diagnosen und Medis werden erkannt, der Verlauf wird in 4 Sätzen zusammengefasst, das PDF wird importiert und die Informationen in MO als Text abgelegt…
Hätte ich ohne Claude Code nie geschafft. So waren es ca. 4 Wochen Entwicklungszeit, meist am Wochenende…
kann man sicherlich auch mit Codex oder ähnlichem auch erledigen… für Claude Code gibt es aktuell nur mehr Erweiterungen
Ich befinde mich zur Zeit auf den Malediven und habe nur kurz versucht, per iPad eine Lösung zu finden. Ich gebe Ihnen recht, dass man das Ergebnis meist noch mal selbst testen muss und dann schauen muss, was rauskommt.
Ohne PC mit MO schwer möglich…
und ich sage mal so, die 17 € pro Monat für Claude lohnen sich für mich regelmäßig. Meinen einfacheren DocCelerate „Nachbau“ habe ich noch vor dem Urlaub fertiggestellt. Sowohl KIM eArztbriefe als auch gescannte Briefe/Faxe werden jetzt per KI verarbeitet, Diagnosen und Medis werden erkannt, der Verlauf wird in 4 Sätzen zusammengefasst, das PDF wird importiert und die Informationen in MO als Text abgelegt…
Hätte ich ohne Claude Code nie geschafft. So waren es ca. 4 Wochen Entwicklungszeit, meist am Wochenende…
kann man sicherlich auch mit Codex oder ähnlichem auch erledigen… für Claude Code gibt es aktuell nur mehr Erweiterungen
Zitat von bro am 20. April 2026, 20:08 UhrBriefe/Faxe werden jetzt per KI verarbeitet, Diagnosen und Medis werden erkannt, der Verlauf wird in 4 Sätzen zusammengefasst, das PDF wird importiert und die Informationen in MO als Text abgelegt…
Wie stellen Sie den Datenschutz mit Claude dar. Das Prüfen der Arztbriefe ist auch für mich ein gepflegtes Vorgehen, allerdings breche ich mir einen ab, die Namen herauszuhalten. Besonders, wenn der Name noch mal im Text auftaucht.
Briefe/Faxe werden jetzt per KI verarbeitet, Diagnosen und Medis werden erkannt, der Verlauf wird in 4 Sätzen zusammengefasst, das PDF wird importiert und die Informationen in MO als Text abgelegt…
Wie stellen Sie den Datenschutz mit Claude dar. Das Prüfen der Arztbriefe ist auch für mich ein gepflegtes Vorgehen, allerdings breche ich mir einen ab, die Namen herauszuhalten. Besonders, wenn der Name noch mal im Text auftaucht.
Zitat von Peter Quick am 21. April 2026, 13:04 UhrHier liegt ein Missverständnis vor: Claude Code habe ich nur benutzt, um die Software zu schreiben. Beziehungsweise schreiben zu lassen
die KI, die ich zur Auswertung der Briefe nutze, läuft auf einem Mac mini in meiner Praxis. Dort läuft aktuell Qwen 3.5 lokal… das reicht für diese Art von Intellektueller Leistung völlig aus…
damit auch kein Problem für die DSGVO… zumindest nicht mehr, als wenn ich es extern bei einem anderen Anbieter laufen lassen würde. Denn der muss ja auch irgendeinen System lokal betreiben. Anders geht es nun mal nicht…
Hier liegt ein Missverständnis vor: Claude Code habe ich nur benutzt, um die Software zu schreiben. Beziehungsweise schreiben zu lassen
die KI, die ich zur Auswertung der Briefe nutze, läuft auf einem Mac mini in meiner Praxis. Dort läuft aktuell Qwen 3.5 lokal… das reicht für diese Art von Intellektueller Leistung völlig aus…
damit auch kein Problem für die DSGVO… zumindest nicht mehr, als wenn ich es extern bei einem anderen Anbieter laufen lassen würde. Denn der muss ja auch irgendeinen System lokal betreiben. Anders geht es nun mal nicht…
Zitat von bro am 21. April 2026, 14:02 Uhrwelches Qwen 3.5 braucht man dafür? Bezahlt wird nach Tokens, wenn ich das richtig verstehe? Ein Rehabericht von 21 Seiten käme dann auf 0,19 US-Cent.
welches Qwen 3.5 braucht man dafür? Bezahlt wird nach Tokens, wenn ich das richtig verstehe? Ein Rehabericht von 21 Seiten käme dann auf 0,19 US-Cent.
Zitat von Peter Quick am 21. April 2026, 14:24 UhrIch würde die größte Variante nehmen, die in den Speicher passt. Bei meinem Mac Mini 16 GB M4 ist das die 3.5 9b. Alles andere überschreitet den Speicher und läuft nur sehr langsam. Ist aber alles nichts für einen normalen PC, da bräuchten Sie schon eine recht teure Grafikkarte.
ich verfolge auch einen zweistufigen Ansatz, mit einer einzigen Stufe war die Erkennung nicht so gut. In der ersten Erkennung gucke ich, welche Formular Typ vorhanden ist, da zum Beispiel ein Therapiebericht von einer Physio keine Medikamente und keine Diagnosen enthält. Und im zweiten Durchlauf ist dann das promt an die entsprechende Dokumenten – Variante angepasst…
also nur der Mac mini mit der KI hilft Ihnen nicht so viel, wenn sie nicht alles manuell machen wollen. Sie brauchen dann auch schon ein passendes frontend und ein passendes Backend, was Texterkennung und Verarbeitung sowie Import in das MedicalOffice regelt.
aber wenn sie nur mal einen Brief durchgehen lassen wollen, dann könnte das manuelle wahrscheinlich schon ausreichen. Dann würde ich aber auch nicht das PDF in die KI werfen, sondern den erkannten Text, optimal als JSON…
mehr können wir gerne per E-Mail oder per direkter Nachricht besprechen. Ich möchte hier nicht den Anschein erwecken, als wollte ich Indamed irgendwie Konkurrenz machen.
Ich würde die größte Variante nehmen, die in den Speicher passt. Bei meinem Mac Mini 16 GB M4 ist das die 3.5 9b. Alles andere überschreitet den Speicher und läuft nur sehr langsam. Ist aber alles nichts für einen normalen PC, da bräuchten Sie schon eine recht teure Grafikkarte.
ich verfolge auch einen zweistufigen Ansatz, mit einer einzigen Stufe war die Erkennung nicht so gut. In der ersten Erkennung gucke ich, welche Formular Typ vorhanden ist, da zum Beispiel ein Therapiebericht von einer Physio keine Medikamente und keine Diagnosen enthält. Und im zweiten Durchlauf ist dann das promt an die entsprechende Dokumenten – Variante angepasst…
also nur der Mac mini mit der KI hilft Ihnen nicht so viel, wenn sie nicht alles manuell machen wollen. Sie brauchen dann auch schon ein passendes frontend und ein passendes Backend, was Texterkennung und Verarbeitung sowie Import in das MedicalOffice regelt.
aber wenn sie nur mal einen Brief durchgehen lassen wollen, dann könnte das manuelle wahrscheinlich schon ausreichen. Dann würde ich aber auch nicht das PDF in die KI werfen, sondern den erkannten Text, optimal als JSON…
mehr können wir gerne per E-Mail oder per direkter Nachricht besprechen. Ich möchte hier nicht den Anschein erwecken, als wollte ich Indamed irgendwie Konkurrenz machen.