gpt4 book ai didi

php - 将多个空格、制表符和换行符替换为一个空格,注释文本除外

转载 作者:行者123 更新时间:2023-12-04 15:32:27 27 4
gpt4 key购买 nike

我需要将多个空格、制表符和换行符替换为一个空格,除了我的 html 中的注释文本。例如下面的代码:

<br/>    <br>

<!--
this is a comment

-->
<br/> <br/>

应该变成

<br/><br><!--
this is a comment

--><br/><br/>

有什么想法吗?

最佳答案

解决方案

经过一番思考,我想出了以下纯正则表达式的解决方案。请注意,此解决方案将删除换行符/制表符/多空格而不是替换它们:

$new_string = preg_replace('#(?(?!<!--.*?-->)(?: {2,}|[\r\n\t]+)|(<!--.*?-->))#s', '$1', $string);
echo $new_string;

解释

(?                              # If
(?!<!--.*?-->) # There is no comment
(?: {2,}|[\r\n\t]+) # Then match 2 spaces or more, or newlines or tabs
| # Else
(<!--.*?-->) # Match and group it (group #1)
) # End if

所以基本上当没有评论时它会尝试匹配空格/制表符/换行符。如果它确实找到它,那么组 1 将不存在并且不会有替换(这将导致删除空格......)。如果有评论,则将评论替换为评论(笑)。

Online demo


解决方案

我想出了一个新策略,这段代码需要 PHP 5.3+:

$new_string = preg_replace_callback('#(?(?!<!--).*?(?=<!--|$)|(<!--.*?-->))#s', function($m){
if(!isset($m[1])){ // If group 1 does not exist (the comment)
return preg_replace('#\s+#s', ' ', $m[0]); // Then replace with 1 space
}
return $m[0]; // Else return the matched string
}, $string);

echo $new_string; // Output

解释正则表达式:

(?                      # If
(?!<!--) # Lookahead if there is no <!--
.*? # Then match anything (ungreedy) until ...
(?=<!--|$) # Lookahead, check for <!-- or end of line
| # Or
(<!--.*?-->) # Match and group a comment, this will make for us a group #1
)
# The s modifier is to match newlines with . (dot)

Online demo

Note: What you are asking and what you have provided as expected output are a bit contradicting. Anyways if you want to remove instead of replacing by 1 space, then just edit the code from '#\s+#s', ' ', $m[0] to '#\s+#s', '', $m[0].

关于php - 将多个空格、制表符和换行符替换为一个空格,注释文本除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17262254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com