我正在编写一个函数,它从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。我怎样才能让它更“密不透风”?
答案 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;)
”替换为“&
”。
答案 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
}