Bir düzeltme fonksiyonu için x karakterlerinden sonra PHP Regex maç ilk satır

3 Cevap php

Ben bir dize alır ve 500. karakterinden sonra ilk yeni satır \n karakter bulur ve yeni satır kadar bir dize döndüren bir kırpma işlevini yazıyorum. \n, 200, 400, ve 600 endekslerine varsa Temelde, ben function (\n dahil değil) dizenin ilk 600 karakteri dönmek istiyorum.

Denedim:

$output = preg_replace('/([^%]{500}[^\n]+?)[^%]*/','$1',$output);

Ben sadece "ilginiz" kapsamına bir karakter sınıfını bulamadım çünkü yüzde işareti kullanılır. Satırsonu hariç çünkü Dot yapmadım. Ne yazık ki, benim işlevi sefil başarısız olur. Herhangi bir yardım veya rehberlik mutluluk duyacağız.

3 Cevap

Şahsen ben regex önlemek ve basit dize işlevlerini kullanabilirsiniz:

// $str is the original string
$nl = strpos( $str, "\n", 500 ); // finds first \n starting from char 500
$sub = substr( $str, 0, $nl );
$final = str_replace( "\n", ' ', $sub );

Siz de \r\n kontrol etmek gerekebilir - örneğin ilk str_replace( "\r\n", "\n", $str ) kullanılarak normalize.

Daha sonra sadece ikinci bit ungreedy yapmak, . maç newlines yapmak için s (dotall) değiştirici ekleyebilirsiniz. Ben de dize 500 karakter altında ve başlangıç ​​için demirlemiş eğer herşeyi maç yaptık:

preg_match('/^.{500}[^\n]+|^.{0,500}$/s', $output, $matches);
$output = $matches[0];

kullanmak

'/(.{500,}?)(?=\n)/s'

desen olarak

sonunda / s nokta yakalamak satırsonlarını, {500}, yapar mümkün olduğunca az soru işareti eşleştirme ile "500 veya daha fazla maç" anlamına gelir. (? = \ n) bütün eşleşen dize \ n tarafından takip edilmesi anlamına gelir ki, bir pozitif ileri yönlü olduğunu, ancak ileri yönlü bir şey yakalamak değil. bu yüzden 500 + karakter dizesi bir satır takip olduğunu denetler, ancak maçta yeni satır (ya da bu konuda, yerine) içermez.

Ileri yönlü bişeydir durumda küçük bir fantezi olsa da, sanırım

'/(.{500,}?)\n/s'

sadece de yapardı. Ben sadece lookaheads beğendim :)