public function segmenter($texte) { $paras = array(); if (test_pcre_unicode()) { $punct = '([[:punct:]]|' . plage_punct_unicode() . ')'; $mode = 'u'; } else { // Plages de poncutation pour preg_match bugge (ha ha) $punct = '([^\\w\\s\\x80-\\xFF]|' . plage_punct_unicode() . ')'; $mode = ''; } $preg = '/(' . $punct . '+)(\\s+|$)|(\\s+)(' . $punct . '*)/' . $mode; while (preg_match($preg, $texte, $regs)) { $p = strpos($texte, $regs[0]); $l = strlen($regs[0]); $punct = $regs[1] ? $regs[1] : $regs[6]; $milieu = ""; if ($punct) { // notes if ($punct == '[[') { $avant = substr($texte, 0, $p) . $regs[5] . $punct; $texte = $regs[4] . substr($texte, $p + $l); } else { if ($punct == ']]') { $avant = substr($texte, 0, $p) . $regs[5] . $punct; $texte = substr($texte, $p + $l); } else { if (preg_match(',^[\\]}]+$,', $punct)) { $avant = substr($texte, 0, $p) . (isset($regs[5]) ? $regs[5] : '') . $punct; $texte = $regs[4] . substr($texte, $p + $l); } else { if (isset($regs[5]) && $regs[5] && preg_match(',^[\\[{]+$,', $punct)) { $avant = substr($texte, 0, $p) . $regs[5]; $texte = $punct . substr($texte, $p + $l); } else { $avant = substr($texte, 0, $p); $milieu = $regs[0]; $texte = substr($texte, $p + $l); } } } } } else { $avant = substr($texte, 0, $p + $l); $texte = substr($texte, $p + $l); } if ($avant) { $paras[] = $avant; } if ($milieu) { $paras[] = $milieu; } } if ($texte) { $paras[] = $texte; } return $paras; }
/** * Renvoie une plage de caractères alphanumeriques unicodes (incomplet...) * * Retourne pour une expression rationnelle une plage * de caractères alphanumériques à utiliser entre crochets [$plage] * * @internal * N'est pas utilisé * Servait à inc/ortho passé dans le grenier * @return string * Plage de caractères **/ function pcre_lettres_unicode() { static $plage_unicode; if (!$plage_unicode) { if (test_pcre_unicode()) { // cf. http://www.unicode.org/charts/ $plage_unicode = '\\w' . '\\x{100}-\\x{24f}' . '\\x{300}-\\x{1cff}'; } else { // fallback a trois sous $plage_unicode = '\\w'; } } return $plage_unicode; }
function pcre_lettres_unicode() { static $plage_unicode; if (!$plage_unicode) { if (test_pcre_unicode()) { // cf. http://www.unicode.org/charts/ $plage_unicode = '\w' // iso-latin . '\x{100}-\x{24f}' // europeen etendu . '\x{300}-\x{1cff}' // des tas de trucs ; } else { // fallback a trois sous $plage_unicode = '\w'; } } return $plage_unicode; }
function segmenter($texte) { $paras = array(); if (test_pcre_unicode()) { $punct = '([[:punct:]]|'.plage_punct_unicode().')'; $mode = 'u'; } else { // Plages de poncutation pour preg_match bugge (ha ha) $punct = '([^\w\s\x80-\xFF]|'.plage_punct_unicode().')'; $mode = ''; } $preg = '/('.$punct.'+)(\s+|$)|(\s+)('.$punct.'*)/'.$mode; while (preg_match($preg, $texte, $regs)) { $p = strpos($texte, $regs[0]); $l = strlen($regs[0]); $punct = $regs[1] ? $regs[1] : $regs[6]; $milieu = ""; if ($punct) { // notes if ($punct == '[[') { $avant = substr($texte, 0, $p) . $regs[5] . $punct; $texte = $regs[4] . substr($texte, $p + $l); } else if ($punct == ']]') { $avant = substr($texte, 0, $p) . $regs[5] . $punct; $texte = substr($texte, $p + $l); } // Attacher les raccourcis fermants au mot precedent else if (preg_match(',^[\]}]+$,', $punct)) { $avant = substr($texte, 0, $p) . $regs[5] . $punct; $texte = $regs[4] . substr($texte, $p + $l); } // Attacher les raccourcis ouvrants au mot suivant else if ($regs[5] && preg_match(',^[\[{]+$,', $punct)) { $avant = substr($texte, 0, $p) . $regs[5]; $texte = $punct . substr($texte, $p + $l); } // Les autres signes de ponctuation sont des mots a part entiere else { $avant = substr($texte, 0, $p); $milieu = $regs[0]; $texte = substr($texte, $p + $l); } } else { $avant = substr($texte, 0, $p + $l); $texte = substr($texte, $p + $l); } if ($avant) $paras[] = $avant; if ($milieu) $paras[] = $milieu; } if ($texte) $paras[] = $texte; return $paras; }