请求解析WordPress中两段正则表达式代码的功能
正则代码逐行解析(针对你的WordPress场景)
嘿,作为正则新手,第一次看这种带捕获组的代码确实容易懵,我帮你把这段代码拆成两部分,结合你给的$content内容一步步讲清楚:
第一部分:捕获页面中的第一个链接地址($baseref)
// catch base url preg_match('/href="(.+?)"/i', $content, $matches); $baseref = (is_array($matches) && !empty($matches)) ? $matches[1] : '';
我们拆解这个正则表达式/href="(.+?)"/i:
/.../i:末尾的i是不区分大小写修饰符,意味着不管是HREF="还是href="都能匹配到href=":匹配字面量的href="字符串,定位到链接标签的属性开头(.+?):这是一个非贪婪捕获组,+?表示尽可能少地匹配任意字符,直到遇到下一个"为止——它的作用就是把href="和下一个"之间的内容(也就是链接地址)抓出来,存到$matches[1]里($matches[0]是整个匹配到的完整字符串,比如href="http://xxx...")
结合你给的$content,这段代码会匹配到第一个出现的href属性:
<a href="http://matookerepublic.com/wp-content/uploads/2018/04/kisuze.png">
所以最终$baseref的值就是http://matookerepublic.com/wp-content/uploads/2018/04/kisuze.png。
后面的三元运算符是做容错处理:如果正则匹配成功($matches是数组且不为空),就把捕获到的链接赋值给$baseref,否则赋值为空字符串,避免报错。
第二部分:捕获页面中的第一张图片地址($img_url)
// get the first image from content preg_match('/<img.+?src="(.+?)"[^}]+>/i', $content, $matches); $img_url = (is_array($matches) && !empty($matches)) ? $matches[1] : '';
先注意:你的$content里的HTML标签是转义过的(比如<变成了<,>变成了>),所以正则里用<来匹配<,>来匹配>。拆解正则:
<img:匹配转义后的<img标签开头.+?:非贪婪匹配任意字符,快速定位到src="属性的位置src="(.+?)":和前面的逻辑一样,非贪婪捕获src="和下一个"之间的图片地址,存到$matches[1][^}]+>:[^}]表示匹配**除了}之外的任意字符**,直到遇到转义的>(也就是>)——这里其实是想匹配完整个img标签的剩余内容,不过写法有点小瑕疵(如果img标签里有}就会提前终止),但在你给的$content`里没问题。
结合你的内容,这段代码会匹配到第一张img标签的src属性:
<img class="alignnone wp-image-32386" src="http://matookerepublic.com/wp-content/uploads/2018/04/kisuze-300x175.png" ... />
所以$img_url的值就是http://matookerepublic.com/wp-content/uploads/2018/04/kisuze-300x175.png。
同样,后面的三元运算符也是容错处理,确保匹配失败时$img_url不会出现错误值。
内容的提问来源于stack exchange,提问作者Joseph Lubandi
相关产品推荐
相关产品推荐

