东燕西飞 2023-04-22 00:09 采纳率: 88.2%
浏览 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日

悬赏问题

  • ¥15 有没有可以帮我搞一个微信建群链接,包括群名称和群资料群头像那种,不会让你白忙
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题