东燕西飞 2023-04-22 00:09 采纳率: 83.3%
浏览 17
已结题

请问一个PHP正则替换的问题


$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', '<meta name="</span>keywords<span class="hljs-string">" content="\\3"', $html);
$html = preg_replace('#<meta[^>]+name\s*=\s*(["|\']*)description[^>]+content\s*=\s*(["|\']*)([^"\'>\s*]+)\\2#i', '<meta name="description" content="\\3"', $html);

这个正则我大致能看懂,但是 \3#i \2 )\2 \3这些数字代表什么意思?我实际替换了下也没发现替换后有数字啊

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-04-22 07:59
    关注

    \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表示引用前面的分组,即匹配到的关键词内容。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 4月22日