PHP Regex соответствует первой новой строке после x символов для функции обрезки - PullRequest
0 голосов
/ 01 декабря 2009

Я пишу функцию обрезки, которая берет строку и находит первый символ новой строки \n после 500-го символа и возвращает строку до новой строки. В принципе, если есть индексы 200, 400 и 600 \n, я хочу, чтобы функция возвращала первые 600 символов строки (не включая \n).

Я пытался:

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

Я использовал знак процента, потому что не смог найти класс персонажа, который бы охватывал «что-нибудь». Дот не делала этого, потому что исключала переводы строки. К сожалению, моя функция не работает с треском. Буду признателен за любую помощь или руководство.

Ответы [ 3 ]

3 голосов
/ 01 декабря 2009

Лично я бы избегал регулярных выражений и использовал бы простые строковые функции:

// $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 );

Вам также может потребоваться проверить \r\n - т.е. сначала нормализовать, используя str_replace( "\r\n", "\n", $str ).

1 голос
/ 01 декабря 2009

использование

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

как шаблон

/ s в конце переводит точку на новую строку, {500,} означает «соответствует 500 или более», а вопросительный знак соответствует как можно меньшему числу. (? = \ n) является положительным взглядом, что означает, что за всей совпадающей строкой должен следовать символ \ n, но просмотр ничего не захватывает. поэтому он проверяет, что за строкой символа 500+ следует новая строка, но не включает новую строку в совпадении (или, в этом случае, замену).

Несмотря на то, что в этом случае вещь выглядит немного странно, я думаю

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

будет так же хорошо. Мне просто нравятся взгляды :)

1 голос
/ 01 декабря 2009

Вы можете добавить модификатор s (DOTALL), чтобы . соответствовал символам новой строки, а затем просто сделать второй бит несвязным. Я также сделал так, чтобы он совпадал со всеми, если строка меньше 500 символов и привязал ее к началу:

preg_match('/^.{500}[^\n]+|^.{0,500}$/s', $output, $matches);
$output = $matches[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...