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

PHP正则表达式匹配修剪函数x个字符后的第一个换行符,php,regex,Php,Regex,我正在编写一个修剪函数,它接受一个字符串,并在第500个字符后找到第一个换行符\n,然后返回一个到换行符的字符串。基本上,如果索引为200、400和600时有\n,我希望函数返回字符串的前600个字符(不包括\n) 我试过: $output = preg_replace('/([^%]{500}[^\n]+?)[^%]*/','$1',$output); 我使用百分号是因为我找不到一个只包含“Everything”的字符类。Dot没有这样做,因为它排除了换行符。不幸的是,我的功能严重失效。任何

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

我试过:

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

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

您可以添加
s
(DOTALL)修饰符以使
匹配换行符,然后只需将第二位取消冻结即可。如果字符串少于500个字符,我还使其匹配所有内容,并将其锚定到开头:

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

您可以添加
s
(DOTALL)修饰符,使
匹配换行符,然后只需将第二位取消冻结即可。如果字符串少于500个字符,我还使其匹配所有内容,并将其锚定到开头:

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

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

// $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\u replace(“\r\n”、“\n”、$str)”进行规范化

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

// $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\u replace(“\r\n”、“\n”、$str”)进行规范化
使用

'/(.{500,}?)(?=\n)/s' 
作为模式

结尾的/s使点捕捉新行,{500,}表示“匹配500或更多”,问号匹配的数量尽可能少。(=\n)是一个正向的前瞻,这意味着整个匹配的字符串后面必须跟一个\n,但前瞻不会捕获任何内容。因此,它检查500多个字符的字符串后面是否有换行符,但在匹配中不包括换行符(或者替换符)

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

'/(.{500,}?)\n/s'
也可以。我只是喜欢长相:)

使用

'/(.{500,}?)(?=\n)/s' 
作为模式

结尾的/s使点捕捉新行,{500,}表示“匹配500或更多”,问号匹配的数量尽可能少。(=\n)是一个正向的前瞻,这意味着整个匹配的字符串后面必须跟一个\n,但前瞻不会捕获任何内容。因此,它检查500多个字符的字符串后面是否有换行符,但在匹配中不包括换行符(或者替换符)

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

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

也可以。我只喜欢lookaheads:)

这是我染上regex发烧后从未想到的解决方案:)。我想把第二行改成
$sub=$nl?substr($str,0,$nl)$str
来解释第一行中的
strpos
调用返回
false
的可能性。此解决方案与我上面的调整配合使用。我很想看看这种方法与本页其他地方使用
preg_match
preg_replace
的方法之间的性能差异。我患上regex发烧后从未想到过一个解决方案:)。我想把第二行改成
$sub=$nl?substr($str,0,$nl)$str
来解释第一行中的
strpos
调用返回
false
的可能性。此解决方案与我上面的调整配合使用。我很想看看这种方法与本页其他地方使用
preg_match
preg_replace
的方法之间的性能差异。