场景:近日,我在开发中遇到了这样一个问题,需要将一段html标签中的 <video>...</video> 标签提取出来并将它替换为src的属性值(即视频的链接),最后拼接成数组返回;
分析:
- 字符串切割。将原始字符串按照<video>标签切割成数组
- 字符串截取。截取src属性值
方案:
$videoStartStr = explode('<video', $content); $l = count($videoStartStr); $videoNum = $l - 1; //视频个数 $data[0] = [ 'type'=>0, 'content'=>$videoStartStr[0], ]; /*生成内容数组*/ for ($i=1;$i<=$videoNum;$i++) { $l = count($data); $videoEndStr = explode('</video>', $videoStartStr[$i]); $data[$l]=[ 'type'=>1, 'content'=>$videoEndStr[0], ]; $data[$l+1]=[ 'type'=>0, 'content'=>$videoEndStr[1], ]; } /*截取视频src*/ foreach ($data as $k=> &$v) { if (!trim($v['content']) ) { unset($data[$k]); } if ($v['type'] == 0) { continue; } $s= strpos($v['content'],"http"); $e= strpos($v['content'],"mp4"); $v['content'] = substr($v['content'],$s,$e-$s+3) ; } $data = array_values($data);
说明:
- $content为一段html标签,含有一个或多个视频(<video>标签)
- 数组中的type 0或1分别表示普通便签(截取后正常返回)或视频链接(即将原始字符串中的video标签提取并替换为他的src链接)
- 这里是一段代码段,并不完整。各位访客如需使用我的这种方法只需定义一下$content字符串并做个输出测试即可!
- 在我的业务中,<video>标签不可能在开头。所以在使用的时候最好在字符串的卡头随机拼接上一些字符串,最后自己去除即可。
拓展:
如果只是单纯的截取某两个字符串之间的字符串,通常会有个问题:不管用函数还是正则通常只能获取一个字符串(比如“phpabcdaefdaghdphp”截取a和d之间的字符串bc、ef和gh,正则 '/a.*d/' 通常会返回从第一个a到最后一个d之间的字符串,函数也只能获取到第一个ad之间的字符串或者最后一个ad之间的字符串)。想了好久才凑出来的如上的逻辑,其他的以此类推吧。。欢迎指正