当前位置: 首页 > 知识库问答 >
问题:

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

唐睿
2024-09-09

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个答案

丌官博文
2024-09-09

<?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;
?>

宣瀚
2024-09-09

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

龙高超
2024-09-09

在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,并输出处理后的内容。

 类似资料:
  • 下面我写了一个C++函数,它通过一个整数向量进行循环。每通过一次,它就从所有的数字中减去最小的数字。它应该在每次传递时返回非零元素的数量(这存储在向量结果中并返回)。然而,每当我尝试运行时,我都会得到“std::bad_alloc”。当删除行“flag=true”时,错误就会消失。我将需要它工作,以便while循环中断。帮我修好这个。

  • 问题内容: 我正在关注egghead.io上的视频教程,但是在尝试遵循他在创建工厂时的示例时,我一直收到“未定义角度”的参考错误,但是我包含了角度脚本 这是我的html页面: 这是我的JavaScript文件“ main.js”: 我已经读过几篇类似的文章,如果我写错了,请纠正我,但是我认为这与引导绑定有关,并且我尝试使用手动引导,但没有成功,仍然遇到相同的错误。 但是我想知道的是,为什么这可以在

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队

  • 保存格式化prettier格式化配置没有生效?.prettierrc.js没有生效,但是配置文件要是写成.prettierrc或者.prettierrc.json json格式就能被读取并生效,这是啥问题呢? 设置步骤如下 添加prettier配置文件 formatOnSave: true 如果我prettier配置文件是json格式的,是能读到项目的prettier配置项并格式化生效 格式化也正

  • 本文向大家介绍浅析PHP的静态成员函数效率更高的原因,包括了浅析PHP的静态成员函数效率更高的原因的使用技巧和注意事项,需要的朋友参考一下 很多php开发人员都知道, 使用类的静态成员函数效率比类的普通成员函数的要高,本文从应用层次分析这个问题 下面是一个范例: 认真看上面的范例,会发现一个有趣的地方,secho1()定义为静态方法后, 在动态类的对像实例中仍可以引用为动态方法,而secho3()

  • 设置超时时间是50毫秒,接口还能正常请求,超时时间不生效 全局设置axios.defaults.timeout = 50 也不生效