1

我正在编写一个函数,它从它在 html 文件中找到的第一个图像标记中找出 src。按照此处此线程中的说明,我得到了一些似乎正在工作的东西:

preg_match_all('#<img[^>]*>#i', $content, $match); 

foreach ($match as $value) {
    $img = $value[0];
                           } 

$stuff = simplexml_load_string($img);
$stuff = $stuff[src];
return $stuff;

但是在使用该函数几分钟后,它开始返回如下错误:

警告:simplexml_load_string() [0function.simplexml-load-string0]:实体:第 1 行:解析器错误:第 42 行的路径/到/脚本中标记 img 第 1 行中的数据过早结束。

警告:simplexml_load_string() [0function.simplexml-load-string0]: tp://feeds.feedburner.com/~f/ChicagobusinesscomBreakingNews?i=KiStN" border="0"> 在第 42 行的 path/to/script 中。

我对 PHP 有点陌生,但似乎我的正则表达式错误地分割了 HTML。我怎样才能使它更“密封”?

4

4 回答 4

2

这两行 PHP 代码应该为您提供 HTML 文件中所有 img 标记中 src 属性的所有值的列表:

preg_match_all('/<img\s+[^<>]*src=["\']?([^"\'<>\s]+)["\']?/i', $content, $result, PREG_PATTERN_ORDER);
$result = $result[1];

为了保持正则表达式简单,我不允许文件名中有空格。如果您想允许这样做,您需要对带引号的属性值(可以有空格)和不带引号的属性值(不能有空格)使用单独的替代方案。

于 2008-11-29T08:47:39.863 回答
0

很可能是因为正则表达式获取的“XML”无论出于何种原因都不是正确的 XML。我可能会选择一个更复杂的正则表达式来提取 src 属性,而不是使用 SimpleXML 来获取 src。这个 REGEX 可能接近你需要的。

<img[^>]*src\s*=\s*['|"]?([^>]*?)['|"]?[^>]*>

您也可以使用真正的 HTML Parsing 库,但我不确定 PHP 中存在哪些选项。

于 2008-11-28T16:02:26.697 回答
0

属性中的 & 符号本身是无效的 XML(它应该被编码为“&amp;”),但有些人仍然在 HTML 页面上的 URL 上使用这种方式(并且所有浏览器都支持它)。也许这就是你的问题。

如果是这种情况,您可以在解析字符串之前对其进行清理,将“<code>&(?!amp;)”替换为“<code>&”。

于 2008-11-28T16:09:51.097 回答
0

关于不同的主题:

foreach ($match as $value) {
    $img = $value[0];
                           } 

可以替换为

$img = $match[count($match) - 1][0];

像这样的东西:

if (preg_match('#<img\s[^>]*>#i', $content, $match)) {
    $img = $match[0]; //first image in file only
    $stuff = simplexml_load_string($img);
    $stuff = $stuff[src];
    return $stuff;
} else {
    return null; //no match found
}
于 2008-11-28T16:34:02.153 回答