복붙노트

PHP를 사용하여 html에서 img src, title 및 alt를 추출하는 방법은 무엇입니까?

PHP

PHP를 사용하여 html에서 img src, title 및 alt를 추출하는 방법은 무엇입니까?

내 웹 사이트에있는 모든 이미지가 제목과 대체 표현으로 나열되는 페이지를 만들고 싶습니다.

나는 이미 모든 HTML 파일을 찾아로드하는 작은 프로그램을 작성했지만, 이제는이 HTML에서 src, title 및 alt를 추출하는 방법에 주저하고있다.

<img src="/image/fluffybunny.jpg" title="Harvey the bunny" alt="a cute little fluffy bunny" />

이것이 정규식으로 끝나야한다고 생각합니다. 그러나 태그의 순서가 다를 수 있기 때문에 나는 그것을 모두 필요로합니다.이 태그를 우아한 방식으로 구문 분석하는 방법을 알지 못합니다. char 길 그러나 그것은 아프다).

해결법

  1. ==============================

    1.

    이런 종류의 문제를 해결하기 위해 regexp를 사용하는 것은 나쁜 생각이며 유지 보수가 불가능하고 신뢰할 수없는 코드로 이어질 가능성이 있습니다. HTML 구문 분석기를 사용하는 것이 좋습니다.

    이 경우 프로세스를 두 부분으로 나누는 것이 좋습니다.

    귀하의 문서가 XML 파서를 사용할 수 없도록 엄격한 xHTML이 아닌 것으로 가정합니다. E.G. 이 웹 페이지 소스 코드 :

    /* preg_match_all match the regexp in all the $html string and output everything as 
    an array in $result. "i" option is used to make it case insensitive */
    
    preg_match_all('/<img[^>]+>/i',$html, $result); 
    
    print_r($result);
    Array
    (
        [0] => Array
            (
                [0] => <img src="/Content/Img/stackoverflow-logo-250.png" width="250" height="70" alt="logo link to homepage" />
                [1] => <img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />
                [2] => <img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />
                [3] => <img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />
                [4] => <img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />
    
    [...]
            )
    
    )
    

    그런 다음 모든 img 태그 속성을 루프로 가져옵니다.

    $img = array();
    foreach( $result as $img_tag)
    {
        preg_match_all('/(alt|title|src)=("[^"]*")/i',$img_tag, $img[$img_tag]);
    }
    
    print_r($img);
    
    Array
    (
        [<img src="/Content/Img/stackoverflow-logo-250.png" width="250" height="70" alt="logo link to homepage" />] => Array
            (
                [0] => Array
                    (
                        [0] => src="/Content/Img/stackoverflow-logo-250.png"
                        [1] => alt="logo link to homepage"
                    )
    
                [1] => Array
                    (
                        [0] => src
                        [1] => alt
                    )
    
                [2] => Array
                    (
                        [0] => "/Content/Img/stackoverflow-logo-250.png"
                        [1] => "logo link to homepage"
                    )
    
            )
    
        [<img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />] => Array
            (
                [0] => Array
                    (
                        [0] => src="/content/img/vote-arrow-up.png"
                        [1] => alt="vote up"
                        [2] => title="This was helpful (click again to undo)"
                    )
    
                [1] => Array
                    (
                        [0] => src
                        [1] => alt
                        [2] => title
                    )
    
                [2] => Array
                    (
                        [0] => "/content/img/vote-arrow-up.png"
                        [1] => "vote up"
                        [2] => "This was helpful (click again to undo)"
                    )
    
            )
    
        [<img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />] => Array
            (
                [0] => Array
                    (
                        [0] => src="/content/img/vote-arrow-down.png"
                        [1] => alt="vote down"
                        [2] => title="This was not helpful (click again to undo)"
                    )
    
                [1] => Array
                    (
                        [0] => src
                        [1] => alt
                        [2] => title
                    )
    
                [2] => Array
                    (
                        [0] => "/content/img/vote-arrow-down.png"
                        [1] => "vote down"
                        [2] => "This was not helpful (click again to undo)"
                    )
    
            )
    
        [<img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />] => Array
            (
                [0] => Array
                    (
                        [0] => src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG"
                        [1] => alt="gravatar image"
                    )
    
                [1] => Array
                    (
                        [0] => src
                        [1] => alt
                    )
    
                [2] => Array
                    (
                        [0] => "http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG"
                        [1] => "gravatar image"
                    )
    
            )
    
       [..]
            )
    
    )
    

    Regexps는 CPU를 많이 사용하므로이 페이지를 캐시 할 수 있습니다. 캐시 시스템이 없다면 ob_start를 사용하고 텍스트 파일에서로드 / 저장하여 자신의 트윅을 조정할 수 있습니다.

    먼저 preg_ match_all을 사용합니다.이 함수는 패턴과 일치하는 모든 문자열을 가져 와서 세 번째 매개 변수에 출력합니다.

    정규 표현식 :

    <img[^>]+>
    

    우리는 그것을 모든 HTML 웹 페이지에 적용합니다. ""문자가 아니며>로 끝나는 모든 문자열로 읽을 수 있습니다.

    (alt|title|src)=("[^"]*")
    

    우리는 그것을 각 img 태그에 연속적으로 적용합니다. "alt", "title"또는 "src"로 시작하는 모든 문자열로 읽은 다음 "="다음에 "" ',' ''가 아닌 '' ' 사이의 하위 문자열을 분리하십시오 ().

    마지막으로 정규 표현식을 다룰 때마다 신속하게 정규 표현식을 테스트 할 수있는 유용한 도구를 갖추면 편리합니다. 온라인 regexp 테스터를 확인하십시오.

    편집 : 첫 번째 의견에 대한 답변.

    내가 (잘하면 소수의) 사람들이 작은 따옴표를 사용한다고 생각하지 않았다는 것은 사실이다.

    글쎄, 만약 당신이 '를 사용하는 경우, 그냥 모든을 교체'로 '.

    둘 다 섞으면. 먼저 자신을 때려야합니다 :-), 대신 ( "|") 또는 "와 [^ ø]를 사용하여 [^"]을 대체하십시오.

  2. ==============================

    2.

    $url="http://example.com";
    
    $html = file_get_contents($url);
    
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    
    $tags = $doc->getElementsByTagName('img');
    
    foreach ($tags as $tag) {
           echo $tag->getAttribute('src');
    }
    
  3. ==============================

    3.

    PHP의 XML 기능을 태스크에 사용하는 간단한 예를 들어 보겠습니다.

    $doc=new DOMDocument();
    $doc->loadHTML("<html><body>Test<br><img src=\"myimage.jpg\" title=\"title\" alt=\"alt\"></body></html>");
    $xml=simplexml_import_dom($doc); // just to make xpath more simple
    $images=$xml->xpath('//img');
    foreach ($images as $img) {
        echo $img['src'] . ' ' . $img['alt'] . ' ' . $img['title'];
    }
    

    이 메서드는 HTML 구문에 대처할 수 있고 입력 문서가 XHTML이 아니므로 DOMDocument :: loadHTML () 메서드를 사용했습니다. 엄밀히 말하면 SimpleXMLElement 로의 변환은 필요하지 않습니다. xpath를 사용하면 xpath 결과가 더 간단 해집니다.

  4. ==============================

    4.

    xpath를 사용하십시오.

    PHP의 경우 simplexml 또는 domxml을 사용할 수 있습니다.

    이 질문도 보아라.

  5. ==============================

    5.

    그것이 XHTML이라면, 예제는 simpleXML 만 필요합니다.

    <?php
    $input = '<img src="/image/fluffybunny.jpg" title="Harvey the bunny" alt="a cute little fluffy bunny"/>';
    $sx = simplexml_load_string($input);
    var_dump($sx);
    ?>
    

    산출:

    object(SimpleXMLElement)#1 (1) {
      ["@attributes"]=>
      array(3) {
        ["src"]=>
        string(22) "/image/fluffybunny.jpg"
        ["title"]=>
        string(16) "Harvey the bunny"
        ["alt"]=>
        string(26) "a cute little fluffy bunny"
      }
    }
    
  6. ==============================

    6.

    스크립트는 다음과 같이 편집해야합니다.

    foreach ($ img_tag로 $ result [0])

    preg_match_all은 배열의 배열을 반환하기 때문에

  7. ==============================

    7.

    이 솔루션 RE :

        $url="http://example.com";
    
        $html = file_get_contents($url);
    
        $doc = new DOMDocument();
        @$doc->loadHTML($html);
    
        $tags = $doc->getElementsByTagName('img');
    
        foreach ($tags as $tag) {
                echo $tag->getAttribute('src');
        }
    

    여러 파일 / URL에서 태그와 속성을 어떻게 얻습니까?

    이렇게하면 저에게 효과가 없었습니다.

        foreach (glob("path/to/files/*.html") as $html) {
    
          $doc = new DOMDocument();
          $doc->loadHTML($html);
    
          $tags = $doc->getElementsByTagName('img');
    
          foreach ($tags as $tag) {
             echo $tag->getAttribute('src');
          } 
        } 
    
  8. ==============================

    8.

    simplehtmldom을 사용할 수 있습니다. 대부분의 jQuery 선택기는 simplehtmldom에서 지원됩니다. 아래에 예가 나와 있습니다.

    // Create DOM from URL or file
    $html = file_get_html('http://www.google.com/');
    
    // Find all images
    foreach($html->find('img') as $element)
           echo $element->src . '<br>';
    
    // Find all links
    foreach($html->find('a') as $element)
           echo $element->href . '<br>'; 
    
  9. ==============================

    9.

    여기 PHP 함수가 있습니다. 비슷한 목적으로 위의 모든 정보에서 함께 잡아 먹었습니다. 즉, 이미지 태그의 너비와 길이 속성을 즉석에서 조정하는 것입니다. 조금 어수선하고, 아마도 신뢰할 수있는 것처럼 보입니다.

    function ReSizeImagesInHTML($HTMLContent,$MaximumWidth,$MaximumHeight) {
    
    // find image tags
    preg_match_all('/<img[^>]+>/i',$HTMLContent, $rawimagearray,PREG_SET_ORDER); 
    
    // put image tags in a simpler array
    $imagearray = array();
    for ($i = 0; $i < count($rawimagearray); $i++) {
        array_push($imagearray, $rawimagearray[$i][0]);
    }
    
    // put image attributes in another array
    $imageinfo = array();
    foreach($imagearray as $img_tag) {
    
        preg_match_all('/(src|width|height)=("[^"]*")/i',$img_tag, $imageinfo[$img_tag]);
    }
    
    // combine everything into one array
    $AllImageInfo = array();
    foreach($imagearray as $img_tag) {
    
        $ImageSource = str_replace('"', '', $imageinfo[$img_tag][2][0]);
        $OrignialWidth = str_replace('"', '', $imageinfo[$img_tag][2][1]);
        $OrignialHeight = str_replace('"', '', $imageinfo[$img_tag][2][2]);
    
        $NewWidth = $OrignialWidth; 
        $NewHeight = $OrignialHeight;
        $AdjustDimensions = "F";
    
        if($OrignialWidth > $MaximumWidth) { 
            $diff = $OrignialWidth-$MaximumHeight; 
            $percnt_reduced = (($diff/$OrignialWidth)*100); 
            $NewHeight = floor($OrignialHeight-(($percnt_reduced*$OrignialHeight)/100)); 
            $NewWidth = floor($OrignialWidth-$diff); 
            $AdjustDimensions = "T";
        }
    
        if($OrignialHeight > $MaximumHeight) { 
            $diff = $OrignialHeight-$MaximumWidth; 
            $percnt_reduced = (($diff/$OrignialHeight)*100); 
            $NewWidth = floor($OrignialWidth-(($percnt_reduced*$OrignialWidth)/100)); 
            $NewHeight= floor($OrignialHeight-$diff); 
            $AdjustDimensions = "T";
        } 
    
        $thisImageInfo = array('OriginalImageTag' => $img_tag , 'ImageSource' => $ImageSource , 'OrignialWidth' => $OrignialWidth , 'OrignialHeight' => $OrignialHeight , 'NewWidth' => $NewWidth , 'NewHeight' => $NewHeight, 'AdjustDimensions' => $AdjustDimensions);
        array_push($AllImageInfo, $thisImageInfo);
    }
    
    // build array of before and after tags
    $ImageBeforeAndAfter = array();
    for ($i = 0; $i < count($AllImageInfo); $i++) {
    
        if($AllImageInfo[$i]['AdjustDimensions'] == "T") {
            $NewImageTag = str_ireplace('width="' . $AllImageInfo[$i]['OrignialWidth'] . '"', 'width="' . $AllImageInfo[$i]['NewWidth'] . '"', $AllImageInfo[$i]['OriginalImageTag']);
            $NewImageTag = str_ireplace('height="' . $AllImageInfo[$i]['OrignialHeight'] . '"', 'height="' . $AllImageInfo[$i]['NewHeight'] . '"', $NewImageTag);
    
            $thisImageBeforeAndAfter = array('OriginalImageTag' => $AllImageInfo[$i]['OriginalImageTag'] , 'NewImageTag' => $NewImageTag);
            array_push($ImageBeforeAndAfter, $thisImageBeforeAndAfter);
        }
    }
    
    // execute search and replace
    for ($i = 0; $i < count($ImageBeforeAndAfter); $i++) {
        $HTMLContent = str_ireplace($ImageBeforeAndAfter[$i]['OriginalImageTag'],$ImageBeforeAndAfter[$i]['NewImageTag'], $HTMLContent);
    }
    
    return $HTMLContent;
    
    }
    
  10. ==============================

    10.

    HTML이 XHTML로 보장된다면 SimpleXML을 시험해 볼 수도 있습니다. 마크 업을 구문 분석하면 이름으로 속성에 액세스 할 수 있습니다. (DOM 라이브러리는 HTML 일 뿐이므로 XML 구문에 의존 할 수 없습니다.)

  11. ==============================

    11.

    모든 img 태그 (] *>)를 얻기 위해 정규 표현식을 작성한 다음 간단한 explode를 사용하면 $ res = explode ( "\" ", $ tags) 출력은 다음과 같이됩니다.

    $res[0] = "<img src=";
    $res[1] = "/image/fluffybunny.jpg";
    $res[2] = "title=";
    $res[3] = "Harvey the bunny";
    $res[4] = "alt=";
    $res[5] = "a cute little fluffy bunny";
    $res[6] = "/>";
    

    폭발하기 전에

    property=
    value
    

    그래서 속성의 순서는 무의미합니다. 당신은 오직 당신이 좋아하는 것을 사용합니다.

  12. ==============================

    12.

    나는 그것을하기 위해 preg_match를 사용했다.

    필자는 워드 프레스에서 얻은 태그 하나 (그리고 다른 마크 업 없음)를 포함하는 문자열을 가지고 있었고 src 속성을 가져 와서 timthumb을 통해 실행할 수있었습니다.

    // get the featured image
    $image = get_the_post_thumbnail($photos[$i]->ID);
    
    // get the src for that image
    $pattern = '/src="([^"]*)"/';
    preg_match($pattern, $image, $matches);
    $src = $matches[1];
    unset($matches);
    

    title이나 alt를 붙잡기위한 패턴에서, $ pattern = '/ title = "([^"] *) "/"; 제목을 잡기 위해 $ pattern ='/ title = "([ "] *)"/ "; alt를 붙잡는 것. 슬프게도, 내 정규 표현식은 한 패스로 세 (alt / title / src)를 모두 잡을만큼 좋지 않습니다.

  13. ==============================

    13.

    PHP의 해결책은 다음과 같습니다.

    QueryPath를 다운로드하고 다음과 같이하십시오.

    $doc= qp($myHtmlDoc);
    
    foreach($doc->xpath('//img') as $img) {
    
       $src= $img->attr('src');
       $title= $img->attr('title');
       $alt= $img->attr('alt');
    
    }
    

    그게 다야, 끝났어!

  14. ==============================

    14.

    아래 코드는 WordPress에 나를 위해 일했습니다 ...

    코드에서 모든 이미지 소스를 추출합니다.

    $search = "any html code with image tags";
    
    preg_match_all( '/src="([^"]*)"/', $search, $matches);
    
    if ( isset( $matches ) )
    {
        foreach ($matches as $match) 
        {
            if(strpos($match[0], "src")!==false)
            {
                $res = explode("\"", $match[0]);
                $image = parse_url($res[1], PHP_URL_PATH);
                $xml .= " <image:image>\n";
                $xml .= " <image:loc>".home_url().$image."</image:loc>\n";
                $xml .= " <image:caption>".htmlentities($title)."</image:caption>\n";
                $xml .= " <image:license>".home_url()."</image:license>\n";
                $xml .= " </image:image>\n";
            }
        }
    }
    

    건배!

  15. ==============================

    15.

    $content =  "<img src='http://google.com/2af5e6ae749d523216f296193ab0b146.jpg' width='40' height='40'>";
    $image   =  preg_match_all('~<img rel="imgbot" remote="(.*?)" width="(.*?)" height="(.*?)" linktext="(.*?)" linkhref="(.*?)" src="(.*?)" />~is', $content, $matches);
    
  16. ==============================

    16.

    regEx를 다음과 같이 쉽게 사용하지 않으려는 이유는 무엇입니까?

    preg_match_all('% (.*)=\"(.*)\"%Uis', $code, $matches, PREG_SET_ORDER);
    

    이렇게하면 다음과 같은 결과가 반환됩니다.

    array(2) {
        [0]=>
        array(3) {
            [0]=>
            string(10) " src="abc""
            [1]=>
            string(3) "src"
            [2]=>
            string(3) "abc"
        }
        [1]=>
        array(3) {
            [0]=>
            string(10) " bla="123""
            [1]=>
            string(3) "bla"
            [2]=>
            string(3) "123"
        }
    }
    
  17. ==============================

    17.

    저기 워드 프레스 또는 HTML 콘텐츠에있는 모든 게시물의 콘텐츠에서 이미지를 검색하기위한 내 솔루션입니다. `

    $content = get_the_content();
    $count = substr_count($content, '<img');
    $start = 0;
    for ($i=0;$i<$count;$i++) {
      if ($i == 0){
        $imgBeg = strpos($content, '<img', $start);
        $post = substr($content, $imgBeg);
      } else {
        $imgBeg = strpos($post, '<img', $start);
        $post = substr($post, $imgBeg-2);
      }
      $imgEnd = strpos($post, '>');
      $postOutput = substr($post, 0, $imgEnd+1);
      $postOutput = preg_replace('/width="([0-9]*)" height="([0-9]*)"/', '',$postOutput);
      $image[$i] = $postOutput;
      $start= $imgEnd + 1;
    } 
    print_r($image);
    

    `

  18. ==============================

    18.

    "]+>]+>/)?>"

    이미지 태그로 중첩 된 앵커 태그를 추출합니다.

  19. ==============================

    19.

    하나의 요소에 대해 DOMDocument를 사용하여이 축소 된 솔루션을 사용할 수 있습니다. '및 "따옴표를 처리하고 html도 유효성을 검사합니다. 가장 좋은 방법은 정규식을 사용하여 고유 한 솔루션이 아닌 기존 라이브러리를 사용하는 것입니다.

    $html = '<img src="/image/fluffybunny.jpg" title="Harvey the bunny" alt="a cute little fluffy bunny" />';
    $attribute = 'src'; 
    
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $attributeValue = @$doc->documentElement->firstChild->firstChild->attributes->getNamedItem($attribute)->value;
    
    echo $attributeValue;
    
  20. ==============================

    20.

    정규 표현식을 사용하여 img 태그 ( "] *>"와 같은 것)를 찾은 다음 각 img 태그에 대해 다른 정규 표현식을 사용하여 각 속성을 찾을 수 있습니다.

    어쩌면 "([a-zA-Z] +) = \"([^ "] *) \" "와 같은 속성을 찾을 수 있습니다. 그러나 태그를 다루는 경우에는 따옴표가 없도록 할 수 있습니다 스프 ... 만약 당신이 그걸로 간다면, 당신은 매치마다 그룹들로부터 매개 변수 이름과 값을 얻을 수 있습니다.

  21. ==============================

    21.

    아마도 이것은 당신에게 올바른 대답을 줄 것입니다 :

    <img.*?(?:(?:\s+(src)="([^"]+)")|(?:\s+(alt)="([^"]+)")|(?:\s+(title)="([^"]+)")|(?:\s+[^\s]+))+.*/> 
    
  22. from https://stackoverflow.com/questions/138313/how-to-extract-img-src-title-and-alt-from-html-using-php by cc-by-sa and MIT lisence