2010-12-14 5 views
1

Je voudrais obtenir des extraits plus intelligents de sections de texte. Comme je vais utiliser la fonction regex_replace de Movable Type, je vais essayer de tout récupérer après les premières phrases.Regex pour tout * après * la première phrase complète (période et espace) * après * N caractères

Alors que \..* obtient tout après la première période, cela laisse souvent un extrait trop court. Comment pourrais-je faire la même chose (tout après la première période) mais en sautant les 100 premiers caractères? Sinon, comment pourrais-je simplement tout saisir après, disons, la deuxième ou la troisième période?

Répondre

0

Vous n'êtes pas familier avec regex_replace, je vais utiliser la fonction PHP preg_replace et vous pouvez adapter en conséquence:

$truncated = preg_replace('/^(.{100}.*?\.).*$/s', '$1', $long); 

Edit: Je ne sais pas ce qui est avec la coloration syntaxique sur la sortie traiter la chose entière comme une chaîne, il semble bien dans l'aperçu.

Et une autre version, qui va essayer d'être intelligent de ne pas briser les nombres avec un point décimal (ou d'autres endroits une période pourrait se produire quelque part autre que la fin d'une phrase):

$truncated = preg_replace('/^(.{100}.*?\.(?![a-z0-9])).*$/s', '$1', $long); 

Explication:

  1. La partie que vous souhaitez conserver est regroupée avec des parenthèses.
  2. Vous allez garder au moins 100 caractères: .{100}
  3. Vous pourrez ensuite conserver les caractères suivants jusqu'au premier point décimal: .*?\.
  4. Dans la deuxième version, j'ai utilisé un lookahead- négatif (?![a-z0-9]) -qui sera faire en sorte que la dernière partie continue à la décimale suivante si le caractère de période est suivi d'un nombre ou d'une lettre. Le point correspond à la nouvelle ligne (le modificateur s à la fin du motif).
  5. Si la fonction regex_replace de Movable Type prend un motif sans délimiteurs (la barre oblique et le suivi /s dans mon motif), vous pouvez utiliser (?s) au début du motif.
  6. Utilisez $1 dans le remplacement pour conserver le premier groupe capturé.
0

La phrase complète est vague, car différentes langues ont différentes façons de coder la fin de la phrase. Supposons qu'un espace après une période est EOS: /^.*?\.\s+(?:.{N})(.*)/ Remplacez N par le nombre désiré.

Questions connexes