PHP 7.3.4中preg_replace()函数未生效的原因是什么?

PHP 7.3.4中preg_replace()函数未生效的原因是什么?
我在学习日常英语是收集了这样一个txt的文本,文件名eng.txt

一、 学习用品 (school things)

pen钢笔 pencil铅笔 pencil-case铅笔盒 ruler尺子 book书 bag包

comic book漫画书 post card明信片 newspaper报纸

schoolbag书包 eraser橡皮 crayon蜡笔 sharpener卷笔刀

story-book故事书 notebook笔记本

Chinese book语文书 English book英语书 math book数学书

magazine杂志 dictionary词典

二、人体(body)

foot脚 head头 face脸 hair头发 nose鼻子

mouth嘴 eye眼睛 ear耳朵 arm手臂 hand手 finger手指

leg腿 tail尾巴

...

我想用php来处理下这个文本文件,去掉多余的回车。

<?php
$file = fopen("eng.txt", "r");
if ($file) {
    $cont = '';
    while (!feof($file)) {
        $cont .= fgets($file);
    }
    fclose($file);
}

$cont = preg_replace("/\n\n/", "\n", $cont);
echo $cont;

不过通过运行,发现并没有达到预期的效果。

如下才是我觉得应该返回的效果。

一、 学习用品 (school things)
pen钢笔 pencil铅笔 pencil-case铅笔盒 ruler尺子 book书 bag包
comic book漫画书 post card明信片 newspaper报纸
schoolbag书包 eraser橡皮 crayon蜡笔 sharpener卷笔刀
story-book故事书 notebook笔记本
Chinese book语文书 English book英语书 math book数学书
magazine杂志 dictionary词典
二、人体(body)
foot脚 head头 face脸 hair头发 nose鼻子
mouth嘴 eye眼睛 ear耳朵 arm手臂 hand手 finger手指
leg腿 tail尾巴
...

以上结果我是用python 实现的,正则替换规则一样,希望得知为什么会在php中不行

# -*- coding: utf-8 -*-
import re
if __name__ == '__main__':
    content = open('eng.txt','r',encoding='utf-8').read()
    content = re.sub(r'\n+', '\n', content)
    print(content)
阅读 3.1k
avatarAI BotBETA

在PHP中使用preg_replace()函数未能达到预期效果的原因可能与你对文件内容的处理以及正则表达式的匹配模式有关。首先,你的PHP代码在读取文件内容并尝试替换连续的换行符时,可能存在一些误解或未处理到的情况。

问题分析

  1. 文件内容的读取:你的PHP代码正确地读取了文件内容,并将其存储在一个变量中。然而,文件内容中的换行符可能不仅仅是\n,特别是在Windows系统中,换行符通常是\r\n
  2. 正则表达式的匹配:你的正则表达式/\n\n/仅匹配两个连续的\n换行符,而不考虑\r\n的情况。如果文件是在Windows系统上创建的或编辑的,那么换行符将是\r\n,这将导致你的正则表达式无法匹配到。

解决方案

要解决这个问题,你可以修改你的正则表达式,以匹配\r\n\n作为换行符的任意组合。你可以使用如下的正则表达式来匹配一个或多个连续的换行符,并将它们替换为单个\n(或\r\n,取决于你的输出需求):

$cont = preg_replace("/[\r\n]+/", "\n", $cont);

这个正则表达式[\r\n]+会匹配一个或多个\r\n字符,从而无论换行符是\n\r\n还是\r(尽管\r单独作为换行符的情况较少见),都可以正确地进行替换。

完整的PHP代码

<?php
$file = fopen("eng.txt", "r");
if ($file) {
    $cont = '';
    while (!feof($file)) {
        $cont .= fgets($file);
    }
    fclose($file);

    // 替换一个或多个连续的换行符为单个换行符
    $cont = preg_replace("/[\r\n]+/", "\n", $cont);
    echo $cont;
}
?>

这段代码将读取eng.txt文件,将所有连续的换行符(无论是\n\r\n还是\r)替换为单个\n,并输出处理后的内容。

2 个回答

py 里面你替换都是用的 \n+,PHP 里面你又用着 \n\n 去了,不同平台下保存的文件的换行符可能是不一样的,可以用 [\r\n]+ 代替

<?php
$file = fopen("eng.txt", "r");
if ($file) {

$cont = '';
while (!feof($file)) {
    $cont .= fgets($file);
}
fclose($file);

}
$cont = preg_replace("/\r?\n+/", "\n", $cont);
echo $cont;
?>

推荐问题
宣传栏