Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_替换两个符号之间多行的换行符_Php_Regex_Preg Replace - Fatal编程技术网

Php preg_替换两个符号之间多行的换行符

Php preg_替换两个符号之间多行的换行符,php,regex,preg-replace,Php,Regex,Preg Replace,如何匹配和{之间的内容,并将它们合并到一行中,而不触及它们之间的间距 这个regex(\.\124;@)[^}]*{包含结尾{,不管我怎么做,我需要(\.\124;@部分,这样我就可以在那里添加更多选择器 是的,我知道我不应该用regex做这件事,但我现在没有其他选择。所以任何帮助都将不胜感激 编辑 我将在php的preg_replace中使用它 原始数据 .a { // rules } .a-b, .a-b .b, .a-b.s .x .y, .x { // rules }

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

这个regex
(\.\124;@)[^}]*{
包含结尾
{
,不管我怎么做,我需要
(\.\124;@
部分,这样我就可以在那里添加更多选择器

是的,我知道我不应该用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
}

更新:Stupildy,我没有注意到这是一个PHP问题,而不是JS问题。我的答案是基于JS的;但是它很容易适应PHP。PHP为替换回调提供了
preg\u replace\u callback
,模式将是相同的


如果我没弄错的话,您希望将多选择器CSS规则和媒体查询折叠成一行

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

试试这个:

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

模式说明:

  • 锚定在一条线的起点
  • 行必须以
    *
    @
    -
    [
    开头,涵盖大多数CSS选择器
  • 在选择器之后,匹配后面的内容,直到
  • }
  • 我们通过回调运行每个匹配,用空格替换换行符
m
(多行)标志告诉JS将我们的锚(
^
)解释为与任何行相关,而不仅仅是第一行

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

您可以使用

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

  • (?:\G(?!\A)|^[@.])
    -上一次成功匹配的结束(
    \G(?!\A)
    )或(
    |
    )字符串的开始(
    ^
    ),然后
    @
  • [^{]*?
    -除
    {
  • \K
    -匹配重置运算符,用于丢弃整个匹配内存缓冲区中迄今为止匹配的所有文本
  • \s+
    -任意一个或多个空白字符
请注意,
m
标志是使
^
匹配行的开头而不仅仅是整个字符串的开头所必需的

见:

$text=“.a{\r\n//规则\r\n}\r\n\r\n.a-b\r\n.a-b.b、.a-b.s\r\n.x.y、.x{\r\n//规则\r\n}\r\n\r\n\n@a{\r\n//规则\r\n}\r\n\r\n@k{\r\n//规则\r\n}”;
echo preg_替换(“~(?:\G(?!\A)| ^[@.])[^{]*?\K\s+~m',”,“,$text);

你说你不想抓住最后一个
{
但是你的模式被编程为包含它。这就是我需要帮助的地方…最后,如果结果与输出中的内容一样,这就足够了。这看起来像JavaScript…我在使用PHP。哦,天哪…这就是我不注意的原因。哦,好吧,你基本上可以根据我的答案改编PHP的概念。PHP有
preg\re放置_callback
来运行替换回调,模式应该是相同的。我希望能够用一个正则表达式来完成。而不是使用回调等。为什么?这些工具的存在是为了让你完成任务。为什么忽略它们?