使用带有用户定义标签的preg_match_all图像源

时间:2013-07-11 11:34:41

标签: php regex preg-match-all

HTML代码

<img src="http://website/image/ngshjk.jpeg" onload="img_onload(this);" onerror="img_onerror(this);" data-pid="dynamicvalue" data-imagesize="ppew" data-error-url="http://img.comb/6/z2default.jpg" class="small_image imageZoom " alt="image" title="" id="visible-image-small" rel="dynamicvalue" data-zoom-src="http://img.comb/6/z21347.jpeg" style="display: inline;">

PHP代码

preg_match_all('/<img(.*) onload="(.*)" \/s',$con,$val);

此页面已经有很多img标签。所以我尝试使用img标签内的一些属性来获取特定图像的src。我在preg_match_all中无法正确。请纠正我在上面的img标签中获取源代码。

3 个答案:

答案 0 :(得分:3)

您可能最好使用懒惰的.*?而不是贪婪的.*

preg_match_all('/<img(.*?)\sonload="([^"]*)"/s',$con,$val);

然后将第二个.*更改为[^"]*

.*?匹配最少数量的字符,直到下一个匹配(在本例中为onload...)和[^"]*匹配引号之间的任何非引号字符。

答案 1 :(得分:0)

描述

此表达式将:

  • 验证图片代码的属性/值为data-imagesize="ppew"
  • 验证图片代码的属性/值为data-pid="ABCDEFGHIJ"
  • 捕获src属性值
  • 避免潜在的难题

<img\b(?=\s) # capture the open tag
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sdata-imagesize="ppew")  # validate data-imagesize exists with a specific value
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sdata-pid="ABCDEFGHIJ")  # validate data-pid exists with a specific value
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=['"]([^"]*)['"]?)  # capture the src attribute value
(?:[^>=]|='[^']*'|="[^"]*"|=[^'"\s]*)*"\s?\/?> # get the entire  tag

enter image description here

实施例

直播示例:http://www.rubular.com/r/PBJ50cax7L

单行正则表达式:<img\b(?=\s)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sdata-imagesize="ppew")(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sdata-pid="ABCDEFGHIJ")(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=['"]([^"]*)['"]?)(?:[^>=]|='[^']*'|="[^"]*"|=[^'"\s]*)*"\s?\/?>

示例文字

注意第一行有一些可能存在问题的条件

<img onmouseover=' data-imagesize="ppew" ; data-pid="ABCDEFGHIJ" ; funSwap(data-imagesize, data-pid) ; ' src="http://website/NotTheDroidYourLookingFor.jpeg" onload="img_onload(this);" onerror="img_onerror(this);" data-pid="jihgfedcba" data-imagesize="ppew" />
<img src="http://website/someurl.jpeg" onload="img_onload(this);" onerror="img_onerror(this);" data-pid="ABCDEFGHIJ" data-imagesize="ppew" />

捕获论坛

[0] = <img src="http://website/someurl.jpeg" onload="img_onload(this);" onerror="img_onerror(this);" data-pid="ABCDEFGHIJ" data-imagesize="ppew" />
[1] = http://website/someurl.jpeg

答案 2 :(得分:0)

要获取页面上的所有图像标记,使用HTML解析工具可能会更容易:

// load your html string
$dom = new DOMDocument();
$dom->loadHTML($your_html_here);


// find all the img tags
$imgs = $dom->getElementsByTagName('img');

// cycle through all image tags
foreach($imgs as $img) {
    $src = $img->getAttribute("src");
    // do something
}