$html = preg_replace('#content=\s*(["|\']*)([^"\'>]+)\\1\s*name\s*=\s*(["|\']*)keywords\\3#i', 'name="keywords" content="\\2"', $html);
$html = preg_replace('#content=\s*(["|\']*)([^"\'>]+)\\1\s*name\s*=\s*(["|\']*)description\\3#i', 'name="description" content="\\2"', $html);
$html = preg_replace('#<meta[^>]+name\s*=\s*(["|\']*)keywords[^>]+content\s*=\s*(["|\']*)([^"\'>\s*]+)\\2#i', '" content="\\3"', $html);
$html = preg_replace('#]+name\s*=\s*(["|\']*)description[^>]+content\s*=\s*(["|\']*)([^"\'>\s*]+)\\2#i', '<meta name="description" content="\\3"', $html);
这个正则我大致能看懂,但是 \3#i \2 )\2 \3这些数字代表什么意思?我实际替换了下也没发现替换后有数字啊
\3#i表示正则表达式中的第三个捕获组,即匹配name属性值的引号类型(单引号或双引号),#i表示正则表达式的模式修饰符,表示忽略大小写。
\2表示正则表达式中的第二个捕获组,即匹配content属性值的内容。在替换字符串中,使用了双引号包裹的\2,表示将第二个捕获组的内容作为替换后的字符串中的变量。
在正则表达式中,#i表示忽略大小写匹配,\s表示匹配空白字符,*表示匹配0个或多个前面的字符,|表示或者,()表示分组,[]表示字符集,+表示匹配1个或多个前面的字符,\\1、\\2、\\3表示引用前面的分组。
在这个例子中,#content=\s*(["|\']*)([^"\'>]+)\\1\s*name\s*=\s*(["|\']*)keywords\\3#i表示匹配meta标签中name属性为keywords且content属性值不为空的情况。其中,(["|\']*)表示匹配双引号或单引号0个或多个,\\1表示引用前面的分组,即匹配到的双引号或单引号,([^"\'>]+)表示匹配除双引号、单引号、大于号、小于号之外的任意字符1个或多个,\\2表示引用前面的分组,即匹配到的关键词内容,\s*表示匹配0个或多个空白字符,name\s*=\s*表示匹配name属性和等号两侧的空白字符,\\3表示引用前面的分组,即匹配到的双引号或单引号。
替换部分'name="keywords" content="\\2"'表示将匹配到的关键词内容替换为name属性为keywords的content属性值。其中,\\2表示引用前面的分组,即匹配到的关键词内容。
输出正方体的边长,并保留两位小数输出; 具体格式见样例。