【问题标题】:Match any horizontal whitespace characters at the start of each line in multiline strings in PHP匹配PHP中多行字符串中每行开头的任何水平空白字符
【发布时间】:2019-05-06 09:25:25
【问题描述】:

我想替换所有新行开头的所有空格。我有两个正则表达式替换:

$txt = preg_replace("/^ +/m", '', $txt);
$txt = preg_replace("/^[^\S\r\n]+/m", '', $txt);

它们中的每一个都匹配不同类型的空格。但是,可能有可能两个空格都存在并且顺序不同,所以我想在新行的开头匹配所有空格的出现。我该怎么做?

注意:第一个正则表达式匹配一个表意空间\u3000 char,这只能在question raw body 中检查(所以渲染不做正确的工作在这里)。第二个正则表达式仅匹配 LF 和 CR 以外的 ASCII 空白字符。 Here is a demo 证明第二个正则表达式与第一个正则表达式匹配的内容不匹配。

【问题讨论】:

  • 你只需要^\h+
  • @revo,谢谢,但是当我使用 ^\h+ 时,$txt 中的所有内容都会被替换。知道为什么吗?
  • 试试"/^\h+/mu"。你的第一个正则表达式匹配一个表意空间,所以你处理 Unicode 文本,u 修饰符在这里可能很方便。
  • @WiktorStribiżew @revo 哦,我打错了一些东西。添加u 确实有效,谢谢!
  • 仅供参考,您的第二个正则表达式 ^[^\S\r\n]+ 包括第一个正则表达式匹配的内容。这意味着第二个正则表达式可以满足您的所有需求,不需要 u 标志。

标签: php regex preg-replace


【解决方案1】:

由于您想从需要使用的 Unicode 字符串中删除任何水平空格

使用

$txt = preg_replace("/^\h+/mu", '', $txt);

详情

  • ^ - 行首(m 修饰符使^ 匹配所有行的开始位置,而不仅仅是字符串的开始位置)
  • \h+ - 一个或多个水平空格
  • u 修饰符将确保 Unicode 文本被视为一系列 Unicode 代码点,而不仅仅是代码单元,并且将使所有正则表达式转义都以 Unicode 模式识别。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2019-04-24
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多