tag:forum.selfhtml.org,2005:/self RegExp: \b matcht auch Umlaute? – SELFHTML-Forum 2006-05-20T18:46:52Z https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973326#m973326 Andreas Dölling 2006-05-20T12:31:24Z 2006-05-20T12:31:24Z RegExp: \b matcht auch Umlaute? <p>Hallo,</p> <p>ist es richtig, daß \b auch Umlaute als Wortgrenze macht?<br> Wenn ja: was kann man dagegen tun?<br> Ich habe in einem Text (UTF-8) das Wort "Geräte". Den Text will ich in zwei Hälften teilen.<br> Dazu verwende ich diesen Ausdruck:<br> preg_match("/^(.{0,".(strlen($contents)/2+20)."})(?:\b)(.*)$/sm", $contents, $matches);</p> <p>Das klappt auch ganz wunderbar - $matches[1] enthält die erste Hälfte, $matches[2] die zweite, wobei normalerweise kein Wort zerschnitten wird.<br> Bei dem Text mit dem Wort "Geräte" allerdings steht dieses Wort am Ende der ersten Hälfte und wird nach dem "ä" abgeschnitten, anstatt daß das tatsächliche Wortende oder das Ende des vorhergehenden Wortes benutzt wird.</p> <p>Hattet Ihr mit diesem Problem schon zu tun? Wie habt Ihr es gelöst?</p> <p>Thanx und ciao,<br> Andreas</p> <div class="signature">-- <br> "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...) </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973335#m973335 Andreas Dölling 2006-05-20T12:36:38Z 2006-05-20T12:36:38Z Noch eine Anmerkung <p>Hallo,</p> <p>ersetze ich in dem besagten Text die "ä" durch "a", dann klappt es - das Wort "Gerate" wird nicht geteilt.<br> Quod erat demonstrandum.</p> <p>Wie also umgehen mit diesem Problem?</p> <p>Ciao,<br> Andreas</p> <div class="signature">-- <br> "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...) </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973332#m973332 Christian Kruse ckruse@wwwtech.de http://wwwtech.de/ 2006-05-20T12:53:32Z 2006-05-20T12:53:32Z RegExp: \b matcht auch Umlaute? <p>你好 Andreas,</p> <p>worauf \b matcht, hängt vom <a href="http://de.php.net/setlocale" rel="nofollow noopener noreferrer">Locale</a> ab.</p> <p>再见,<br>  克里斯蒂安</p> <div class="signature">-- <br> <a href="http://ck.kennt-wayne.de/fruehling" rel="nofollow noopener noreferrer">Frühling</a> | <a href="http://ck.kennt-wayne.de/programmierer-auf-crack" rel="nofollow noopener noreferrer">Programmierer auf Crack</a><br> Das Sein entsteht aus dem Nicht-Sein.<br> <a href="http://wwwtech.de/" rel="noopener noreferrer">http://wwwtech.de/</a><br> </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973330#m973330 seth email_selfforum@wg-karlsruhe.de http://www.bierdatenbank.de 2006-05-20T13:02:39Z 2006-05-20T13:02:39Z RegExp: \b matcht auch Umlaute? <p>gudn tach!</p> <blockquote> <p>ist es richtig, daß \b auch Umlaute als Wortgrenze macht?</p> </blockquote> <p><a href="http://de3.php.net/manual/en/reference.pcre.pattern.syntax.php#regexp.reference.backslash" rel="nofollow noopener noreferrer">u.u.</a></p> <blockquote> <p>Wenn ja: was kann man dagegen tun?</p> </blockquote> <p>evtl. waere eine moeglichkeit <a href="http://php.net/setlocale" rel="noopener noreferrer">setlocale</a>.<br> eine andere moeglichkeit: \b und \w nachbauen...</p> <p>"A word boundary is a position in the subject string where the current character and the previous character do not both match \w or \W (i.e. one matches \w and the other matches \W), or the start or end of the string if the first or last character matches \w, respectively." (aus dem php-manual ueber pcre)</p> <blockquote> <p>Ich habe in einem Text (UTF-8)</p> </blockquote> <p>dann wird dir evtl. <a href="http://de3.php.net/manual/en/reference.pcre.pattern.syntax.php#regexp.reference.unicode" rel="nofollow noopener noreferrer">das</a> weiterhelfen.</p> <blockquote> <p>(?:\b)</p> </blockquote> <p>ist uebrigens das gleiche wie</p> <p>\b</p> <blockquote> <p>Hattet Ihr mit diesem Problem schon zu tun?</p> </blockquote> <p>noe, ich vermeide umlaute und sz bzw. ersetze sie.</p> <p>prost<br> seth</p> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973327#m973327 Andreas Dölling 2006-05-20T13:23:42Z 2006-05-20T13:23:42Z Lösung? <p>Hallo,</p> <p>ich habe nun doch Seths Vorschlag aufgegriffen, mir \b selbst zusammenzusetzen. War dann doch nicht so problematisch (im Gegensatz zur Definition von \w).<br> Mein regulärer Ausdruck sieht nun so aus:<br> /^(.{0,".(strlen($contents)/2+20)."})<a href=".*" rel="noopener noreferrer">\s,.!?-</a>$/sm</p> <p>Und damit klappt es.<br> Seht Ihr noch Schwachstellen?</p> <p>Danke auf jeden Fall für die superschnelle Hilfe!</p> <p>Ciao,<br> Andreas</p> <div class="signature">-- <br> "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...) </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973328#m973328 Andreas Dölling 2006-05-20T13:33:32Z 2006-05-20T13:33:32Z Lösung? <p>Hallo,</p> <blockquote> <p>/^(.{0,".(strlen($contents)/2+20)."})<a href=".*" rel="noopener noreferrer">\s,.!?-</a>$/sm</p> </blockquote> <p>da es auch ungerade Zahlen gibt, sollte es dann doch besser so aussehen:<br> /^(.{0,".(ceil(strlen($contents)/2)+20)."})<a href=".*" rel="noopener noreferrer">\s,.!?-</a>$/sm</p> <p>;)</p> <p>Ciao,<br> Andreas</p> <div class="signature">-- <br> "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...) </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973329#m973329 seth email_selfforum@wg-karlsruhe.de http://www.bierdatenbank.de 2006-05-20T15:15:32Z 2006-05-20T15:15:32Z Lösung? <p>gudn tach!</p> <blockquote> <p>/^(.{0,".(ceil(strlen($contents)/2)+20)."})<a href=".*" rel="noopener noreferrer">\s,.!?-</a>$/sm</p> </blockquote> <p>das ist aber nicht mehr das gleiche vie vorher, denn vorher wurde das worttrennzeichen in $1 oder $2 (je nach laenge von $contents und der position des trennzeichens) gespeichert. jetzt geht es floeten.</p> <p>btw.: je nach beschaffenheit des strings und den informationen, die dir darueber vorliegen, kann es besser sein die zeichenklasse der trennzeichen als negierte nicht-trennzeichen-klasse zu betrachten. also statt [\s,.!?-] [^a-zA-Z0-9_äöüÄÖÜß].</p> <p>eine etwas mehr an \b angelehnte nachbau-idee ist uebrigens folgende:<br>   $z='[a-zA-Z0-9_äöüÄÖÜß]';<br>   $n='[^a-zA-Z0-9_äöüÄÖÜß]';<br>   (?:(?<!$z)(?!$n)|(?<!$n)(?!$z))<br> spontan faellt mir kein beispiel ein, bei welchem \b und dieses ding was unterschiedliches machen wuerden (mal von von den locale-einstellungen abgesehen).</p> <p>prost<br> seth</p> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973331#m973331 Andreas Dölling 2006-05-20T13:18:56Z 2006-05-20T13:18:56Z RegExp: \b matcht auch Umlaute? <p>Hallo,</p> <blockquote> <p>eine andere moeglichkeit: \b und \w nachbauen...</p> </blockquote> <p>ungern...</p> <blockquote> <p>"A word boundary is a position in the subject string where the current character and the previous character do not both match \w or \W (i.e. one matches \w and the other matches \W), or the start or end of the string if the first or last character matches \w, respectively." (aus dem php-manual ueber pcre)</p> </blockquote> <p>Ja, hast recht - aus dieser Definition geht klar hervor, daß \b abhängig von der locale-Einstellung ist.</p> <blockquote> <p>dann wird dir evtl. <a href="http://de3.php.net/manual/en/reference.pcre.pattern.syntax.php#regexp.reference.unicode" rel="nofollow noopener noreferrer">das</a> weiterhelfen.</p> </blockquote> <p>Phew - damit habe ja noch nie gearbeitet.</p> <blockquote> <p>noe, ich vermeide umlaute und sz bzw. ersetze sie.</p> </blockquote> <p>Hm, genau _das_ will ich aber nicht mehr. Ich bin gerade dabei, das Textarchiv eines Fanzines zu "säubern", wo im Moment alle Texte als HTML mit Umlaut-Entities und ziemlich verschwurbeltem Old-School-Markup vorliegen.<br> Und ein Ziel ist es auch, die Texte als saubere UTF-8-Texte vorliegen zu haben - ohne Entities, mit ganz normalen Umlauten.</p> <blockquote> <p>prost</p> </blockquote> <p>Erst heute abend!<br> ;)</p> <p>Ciao,<br> Andreas</p> <div class="signature">-- <br> "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...) </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973333#m973333 Andreas Dölling 2006-05-20T13:02:04Z 2006-05-20T13:02:04Z RegExp: \b matcht auch Umlaute? <p>Hallo,</p> <p>danke für den Tipp!<br> Leider ändert sich aber auch mit setlocale(LC_ALL, 'de_DE'); oder mit setlocale(LC_TIME, 'de_DE.UTF8'); nichts am Verhalten meines Scripts.<br> :/</p> <p>Ciao,<br> Andreas</p> <div class="signature">-- <br> "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...) </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973334#m973334 Christian Kruse ckruse@wwwtech.de http://wwwtech.de/ 2006-05-20T13:04:08Z 2006-05-20T13:04:08Z RegExp: \b matcht auch Umlaute? <p>你好 Andreas,</p> <blockquote> <p>Leider ändert sich aber auch mit setlocale(LC_ALL, 'de_DE'); oder mit setlocale(LC_TIME, 'de_DE.UTF8'); nichts am Verhalten meines Scripts.<br> :/</p> </blockquote> <p>ich glaube, setlocale(LC_ALL,"de_DE.UTF8") wäre auch sinnvoller :) Vorrausgesetzt, das Locale existiert, das musst du natürlich vorher nachprüfen.</p> <p>再见,<br>  克里斯蒂安</p> <div class="signature">-- <br> <a href="http://ck.kennt-wayne.de/fruehling" rel="nofollow noopener noreferrer">Frühling</a> | <a href="http://ck.kennt-wayne.de/programmierer-auf-crack" rel="nofollow noopener noreferrer">Programmierer auf Crack</a><br> Kommt ein Vektor zur Drogenberatung: "Hilfe, ich bin linear abhaengig!"<br> <a href="http://wwwtech.de/" rel="noopener noreferrer">http://wwwtech.de/</a><br> </div> https://forum.selfhtml.org/self/2006/may/20/regexp-b-matcht-auch-umlaute/973336#m973336 EisFuX selfhtml@eisfux.de 2006-05-20T18:46:52Z 2006-05-20T18:46:52Z /u und [:alpha:] <p>Hallo Andreas,</p> <blockquote> <p>ersetze ich in dem besagten Text die "ä" durch "a", dann klappt es - das Wort "Gerate" wird nicht geteilt.<br> Quod erat demonstrandum.</p> <p>Wie also umgehen mit diesem Problem?</p> </blockquote> <p>Es gibt einen Modifikator '/u' für UTF-8-Patterns.<br> Und wenn ich Zeichenklassen mit _allen_ definierten Buchstaben brauche, benutze ich '[:alpha:]' und nicht 'a-zA-Z' oder '\w'. Möglicherweise kann ja '/[<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>]/' dein '\b' ersetzen ...</p> <p>MffG<br> EisFuX</p> <div class="signature">-- <br> Auch meine Hosenträger sind intelligent, in dem Sinne, das man sie regulieren kann. Sie besitzen ein adaptives Verhalten.<br> <a href="http://de.wikipedia.org/wiki/Stanis%C5%82aw_Lem" rel="nofollow noopener noreferrer">Stanisław Lem</a><br> <img src="http://alopex.pyrokar.lima-city.de/img.php/fox_048.gif" alt="" loading="lazy"> </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>:alpha: <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section>