如何用preg_match从HTML的JSON数据中提取指定图片URL
如何用preg_match从HTML中提取指定JSON字段里的URL?
首先得指出你之前写的正则问题出在哪:你用了未转义的|,这个符号在正则里是**分支(或)**的意思,所以你的表达式/"image_full","1080|(.*?)"/会被解析成匹配"image_full","1080" 或者 (.*?)",完全偏离了你要捕获1080对应URL的目标。
方法一:修正正则表达式
针对你的需求,我们需要:
- 精准匹配
"image_full","1080|这个前缀(注意转义|,因为它是正则元字符) - 捕获从这个前缀后到第一个逗号前的内容(因为目标URL后面就是分隔不同分辨率地址的逗号)
修正后的代码如下:
$str = '<p>text html </p> <pre><code>,["pid","VJHggI_XrKLWQ"] ,["image_full","1080|https://pic.website.com/bdnsns,800|https://pic2.website.com/bdnsns"] </code></pre>'; // 如果是从文件/URL获取内容,用下面这行替换上面的$str定义 // $str = file_get_contents('your_target_url_or_file_path'); if(preg_match('/"image_full","1080\|([^,]+)/', $str, $matches)){ echo $matches[1]; // 输出:https://pic.website.com/bdnsns }
正则关键点解释:
\|:转义管道符,避免被当作分支解析[^,]+:否定字符集,匹配任意非逗号的字符,刚好精准截取到1080对应的URL(因为后面就是分隔两个分辨率地址的逗号)- 如果担心URL中出现逗号(虽然图片URL极少出现这种情况),也可以调整为匹配到双引号前的内容:
/"image_full","1080\|([^"]+)/,但这样会捕获整个分辨率字符串,后续需要再拆分。
方法二:用JSON解析(更健壮的方案)
因为目标内容本质是JSON片段,用正则提取容易因为HTML/JSON格式的微小变化失效,更可靠的方式是先提取JSON内容再解析:
$str = '<p>text html </p> <pre><code>,["pid","VJHggI_XrKLWQ"] ,["image_full","1080|https://pic.website.com/bdnsns,800|https://pic2.website.com/bdnsns"] </code></pre>'; // 第一步:提取pre标签内的JSON片段 preg_match('/<pre><code>(.*?)<\/code><\/pre>/s', $str, $codeMatches); if (!empty($codeMatches[1])) { // 整理成合法的JSON数组格式(原内容是两个数组用逗号分隔,外层加[]包裹) $jsonStr = '[' . trim($codeMatches[1]) . ']'; $data = json_decode($jsonStr, true); // 遍历找到image_full的项 foreach ($data as $item) { if ($item[0] === 'image_full') { // 拆分不同分辨率的地址 $imageEntries = explode(',', $item[1]); foreach ($imageEntries as $entry) { list($resolution, $url) = explode('|', $entry); if ($resolution === '1080') { echo $url; // 输出目标URL break; } } break; } } }
这个方案的优势是:即使JSON里的空格、换行等格式变化,或者后续新增其他分辨率地址,代码依然能正常工作,不会像正则那样容易失效。
内容的提问来源于stack exchange,提问作者dexter
相关产品推荐
相关产品推荐

