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
来运行替换回调,模式应该是相同的。我希望能够用一个正则表达式来完成。而不是使用回调等。为什么?这些工具的存在是为了让你完成任务。为什么忽略它们?