当我使用它从HTML中捕获img src时,为什么这个正则表达式会返回错误?

时间:2008-11-28 15:57:54

标签: php html xml regex simplexml

我正在编写一个函数,它从html文件中找到的第一个图像标记中删除src。按照this thread中的说明,我得到了一些似乎有用的东西:

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行路径/ to / script中标记img第1行中数据的过早结束。

  

警告:simplexml_load_string()[0function.simplexml-load-string0]:tp://feeds.feedburner.com/~f/ChicagobusinesscomBreakingNews?i = KiStN“border =”0“&gt; in path / to / script在第42行。

我是PHP的新手,但似乎我的正则表达式错误地删除了HTML。我怎样才能让它更“密不透风”?

4 个答案:

答案 0 :(得分:2)

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

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

为了保持正则表达式简单,我不允许文件名中包含空格。如果要允许此操作,则需要为引用的属性值(可以包含空格)和不带引号的属性值(不能包含空格)使用单独的替代项。

答案 1 :(得分:0)

最有可能的原因是正则表达式拾取的“XML”因任何原因而不是正确的XML。我可能会选择一个更复杂的正则表达式来取出src属性,而不是使用SimpleXML来获取src。这个REGEX可能接近你所需要的。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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
}