当前位置: 首页 > 面试题库 >

如何以最聪明的方式替换PHP中的不同换行符样式?

闻人树
2023-03-14
问题内容

我的文字可能具有不同的换行样式。我想将所有换行符’\ r \ n’,’\ n’,’\ r’替换为同一换行符(在本例中为\ r \ n)。

最快的方法是什么?我当前的解决方案如下所示:

    $sNicetext = str_replace("\r\n",'%%%%somthing%%%%', $sNicetext);
    $sNicetext = str_replace(array("\r","\n"),array("\r\n","\r\n"), $sNicetext);
    $sNicetext = str_replace('%%%%somthing%%%%',"\r\n", $sNicetext);

问题是您无法一次替换,因为\ r \ n将被复制到\ r \ n \ r \ n。

感谢您的帮助!


问题答案:
$string = preg_replace('~\R~u', "\r\n", $string);

如果您不想替换所有Unicode换行符,而是仅替换CRLF样式的换行符,请使用:

$string = preg_replace('~(*BSR_ANYCRLF)\R~', "\r\n", $string);

\R匹配这些换行符,u是将输入字符串视为UTF-8的修饰符。

从PCRE文档:

什么\R搭配

默认情况下,模式中的序列\ R与任何Unicode换行符序列匹配,无论选择了什么作为行尾序列。如果指定

     --enable-bsr-anycrlf

默认值已更改,因此\ R仅匹配CR,LF或CRLF。调用库函数时,可以覆盖构建PCRE时选择的任何内容。

换行序列

默认情况下,在字符类外部,转义序列\ R与任何Unicode换行序列匹配。在非UTF-8模式下,\ R等效于以下内容:

    (?>\r\n|\n|\x0b|\f|\r|\x85)

这是“原子团”的一个例子,其细节在下面给出。该特定组匹配两个字符的序列CR,然后匹配LF,或者匹配单个字符LF(换行符,U +
000A),VT(垂直制表符,U + 000B),FF(换页符,U + 000C),CR之一(回车,U + 000D)或NEL(下一行,U +
0085)。两字符序列被视为不可拆分的单个单元。

在UTF-8模式下,添加了两个额外的代码点大于255的字符:LS(行分隔符,U + 2028)和PS(段分隔符,U +
2029)。不需要Unicode字符属性支持即可识别这些字符。

通过在编译时或模式匹配时设置选项PCRE_BSR_ANYCRLF,可以限制\
R仅匹配CR,LF或CRLF(而不是完整的Unicode行结尾)。(BSR是“反斜杠R”的缩写。)在构建PCRE时,可以将其设为默认值;否则,将默认为默认值。如果是这种情况,则可以通过PCRE_BSR_UNICODE选项请求其他行为。也可以通过使用以下序列之一启动模式字符串来指定这些设置:

    (*BSR_ANYCRLF)   CR, LF, or CRLF only
    (*BSR_UNICODE)   any Unicode newline sequence

这些将覆盖默认设置和给pcre_compile()或pcre_compile2()提供的选项,但是它们可以被给pcre_exec()或pcre_dfa_exec()提供的选项覆盖。请注意,这些与Perl不兼容的特殊设置仅在模式的开始就可以识别,并且必须使用大写字母。如果存在不止一个,则使用最后一个。它们可以与换行符更改结合使用;例如,模式可以以以下内容开头:

    (*ANY)(*BSR_ANYCRLF)

它们也可以与( UTF8)或( UCP)特殊序列结合使用。在字符类内部,\ R被视为无法识别的转义序列,因此默认情况下与字母“
R”匹配,但是如果设置了PCRE_EXTRA,则会导致错误。



 类似资料:
  • 我想创建一个库,因为我找不到一个可以将秒或毫秒转换为时间的库。我指的是: 1)如果我有61秒,时间格式将是:1:01(不是1:1) 我之所以进行搜索并提出这些问题,是因为我想在上的媒体播放器中使用这个算法来显示歌曲的总时间和当前的秒数。 例如,我有一些混音超过一个小时,音乐只有几分钟,在播放时显示音乐文件的总时间00:02:30是不相关的,正确的方法是:2:30,因为没有小时(hour==0)。如

  • 问题内容: 我需要以最有效的方式替换字符串中的许多不同子字符串。除了使用string.replace替换每个字段的强力方法以外,还有其他方法吗? 问题答案: 如果你要处理的字符串很长,或者你要处理许多字符串,那么使用java.util.regex.Matcher可能是值得的(这需要花很长时间进行编译,因此效率不高) (如果你的输入很小或搜索模式经常更改)。 以下是一个完整的示例,基于从地图中获取的

  • 问题内容: 我执行以下查询,由于某种原因,它没有替换数据库中的换行符。它说Rows匹配1,但没有变化。有什么问题吗? 问题答案: 您可以使用而不是匹配换行符。 代码:

  • 我有两个文本文件,并用第二个文件中的实际匹配项替换XXX占位符-按照第二个文件中给出的顺序。 第一个文本是一个文件,在一行中有多行和多个占位符。 欧盟由以下国家组成:XXX、XXX、XXX、XXX、XXX。。。。欧盟内最大的三个国家是XXX,XXX,XXX。 第二个文件是每行一个匹配的列表: 波兰荷兰丹麦西班牙意大利德国法国 我想把它替换如下: 欧洲联盟由下列国家组成:波兰、荷兰、丹麦、西班牙、意

  • 问题内容: 我在多线程环境中有一个有状态的Bean,它将其状态保存在映射中。现在,我需要一种在一次原子操作中替换该映射的所有值的方法。 目前,我用作的实现,但这不是必需的。 我认为解决此问题的唯一方法是制作全局 地图并完全替换地图或使用。有没有更好的办法? 我的更新非常频繁,每秒一次或两次,但是机会很少。同样,整个地图只会包含少于20个值。 问题答案: 使用CAS的方法是在每次批量更新时复制地图内

  • 问题内容: 在保留整个文档的格式的同时,我需要帮助替换Word文档中的字符串。 我使用的是python- docx,在阅读了文档后,它可用于整个段落,因此我松散了诸如粗体或斜体字之类的格式。包括要替换的文本以粗体显示,我希望保持这种状态。我正在使用此代码: 因此,如果我实现它并想要类似(包含要替换的字符串的段落丢失其格式): 这是 第1款 ,这是 粗体 文本。 这是 第2段 ,我将替换 旧文本 当