PHP正则表达式在修剪函数的x个字符后匹配第一个换行符

时间:2009-12-01 20:37:57

标签: php regex

我正在编写一个修剪函数,它接受一个字符串并在第500个字符后找到第一个换行符\n并返回一个字符串直到换行符。基本上,如果索引为200,400和600的\n,我希望函数返回字符串的前600个字符(不包括\n)。

我试过了:

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

我使用了百分号,因为我找不到一个只包含“everthing”的字符类。 Dot没有这样做,因为它排除了换行符。不幸的是,我的功能失败了。任何帮助或指导将不胜感激。

3 个答案:

答案 0 :(得分:3)

我个人会避免使用正则表达式并使用简单的字符串函数:

// $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 :(得分:1)

您可以添加s(DOTALL)修饰符以使.匹配换行符,然后只是将第二位置为不合格。如果字符串小于500个字符并将其锚定到开头,我也使它匹配所有内容:

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

答案 2 :(得分:1)

使用

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

作为模式

最后的/ s使点捕获换行符,{500,}表示“匹配500或更多”,问号匹配尽可能少。 (?= \ n)是一个正向前瞻,这意味着整个匹配的字符串必须后跟一个\ n,但是前瞻不会捕获任何内容。所以它会检查500+字符串后面是换行符,但不包括匹配中的换行符(或者替换,就此而言)。

虽然在这种情况下前瞻性的东西有点花哨,但我想

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

也会这样做。我只是喜欢向前看:)