【问题标题】:preg_replace replace line breaks across multiple lines between two symbolspreg_replace 替换两个符号之间多行的换行符
【发布时间】:2021-03-24 09:20:13
【问题描述】:

如何匹配 .{ 之间的内容并将它们合并到一行而不触及它们之间的间距。

无论我尝试什么,这个正则表达式(\.|@)[^}]*\{ 都包含结尾{,我需要(\.|@) 部分,以便我可以在其中添加更多选择器。 Online Regex

是的,我知道我不应该使用正则表达式来执行此操作,但目前我没有其他选择。因此,我们将不胜感激任何帮助。

编辑 我将在 php 的 preg_replace 中使用它

原始数据

.a {
    // rules
}

.a-b,
.a-b .b, .a-b.s
.x .y, .x {
    // rules
}

@a {
    // rules
}

@k {
    // rules
}

输出

.a {
    // rules
}

.a-b, .a-b .b, .a-b.s, .x .y, .x {
    // rules
}

@a {
    // rules
}

@k {
    // rules
}

【问题讨论】:

  • 你说你不想抓住最后一个 { 但你的模式被编程包含它。
  • 这就是我需要帮助的......最后,如果结果与输出中的内容一样就足够了。

标签: php regex preg-replace


【解决方案1】:

你可以使用

preg_replace('~(?:\G(?!\A)|^[@.])[^{]*?\K\s+~m', ' ', $text)

请参阅regex demo。详情:

  • (?:\G(?!\A)|^[@.]) - 上一个成功匹配的结束 (\G(?!\A)) 或 (|) 字符串的开始 (^) 然后是 @.
  • [^{]*? - 除{ 之外的任何零个或多个(但尽可能少)字符
  • \K - 匹配重置操作符,丢弃目前在整个匹配内存缓冲区中匹配的所有文本
  • \s+ - 任意一个或多个空格字符。

注意m 标志,它是使^ 匹配行的开头,而不仅仅是整个字符串的开头。

PHP demo

$text = ".a {\r\n    // rules\r\n}\r\n\r\n.a-b,\r\n.a-b .b, .a-b.s\r\n.x .y, .x {\r\n    // rules\r\n}\r\n\r\n@a {\r\n    // rules\r\n}\r\n\r\n@k {\r\n    // rules\r\n}";
echo preg_replace('~(?:\G(?!\A)|^[@.])[^{]*?\K\s+~m', ' ', $text);

【讨论】:

    【解决方案2】:

    更新:愚蠢,我错过了这是一个 PHP 问题,而不是 JS 问题。我的答案是基于 JS 的;但是它很容易适应 PHP。 PHP 有preg_replace_callback 用于替换回调,模式将相同。


    如果我理解正确,您希望将多选择器 CSS 规则和媒体查询折叠成单行。

    首先要指出的是,您当前的模式并非对所有 CSS 选择器都是安全的。例如,它不会涵盖以#* 开头的那些。

    试试这个:

    let edited = str.replace(/^[\*\.#@:\-\[][\s\S]+?(?=\{)/mg, match => {
        return match.replace(/\n/g, ' ');
    });
    

    Demo.

    模式说明:

    • 定位到行首
    • 该行必须以.#*@-:[ 开头,涵盖大多数 CSS 选择器。
    • 按照选择器,匹配后面的任何内容,直到...
    • }
    • 我们通过回调运行每个匹配项,用空格替换换行符。

    m(多行)标志告诉 JS 将我们的锚点 (^) 解释为与任何行有关,而不仅仅是第一行。

    g(全局)标志处理所有实例,而不仅仅是第一个找到的。

    【讨论】:

    • 这看起来像 JavaScript... 我正在使用 PHP。
    • 天哪……这就是我不注意的结果。哦,好吧,您基本上可以适应我对 PHP 的回答中的概念。 PHP 有preg_replace_callback 来运行替换回调,模式应该是一样的。
    • 我希望能够用一个正则表达式来完成。而不是使用回调等。
    • 为什么?这些工具可以让您完成任务。为什么忽略它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2020-04-17
    • 2021-02-12
    相关资源
    最近更新 更多