PHP를 사용하여 html에서 img src, title 및 alt를 추출하는 방법은 무엇입니까?
PHPPHP를 사용하여 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.
이런 종류의 문제를 해결하기 위해 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.
$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.
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.
xpath를 사용하십시오.
PHP의 경우 simplexml 또는 domxml을 사용할 수 있습니다.
이 질문도 보아라.
-
==============================
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.
스크립트는 다음과 같이 편집해야합니다.
foreach ($ img_tag로 $ result [0])
preg_match_all은 배열의 배열을 반환하기 때문에
-
==============================
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.
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.
여기 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.
HTML이 XHTML로 보장된다면 SimpleXML을 시험해 볼 수도 있습니다. 마크 업을 구문 분석하면 이름으로 속성에 액세스 할 수 있습니다. (DOM 라이브러리는 HTML 일 뿐이므로 XML 구문에 의존 할 수 없습니다.)
-
==============================
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.
나는 그것을하기 위해 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.
PHP의 해결책은 다음과 같습니다.
QueryPath를 다운로드하고 다음과 같이하십시오.
$doc= qp($myHtmlDoc); foreach($doc->xpath('//img') as $img) { $src= $img->attr('src'); $title= $img->attr('title'); $alt= $img->attr('alt'); }
그게 다야, 끝났어!
-
==============================
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.
$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.
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.
저기 워드 프레스 또는 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.
"]+>]+>/)?>"
이미지 태그로 중첩 된 앵커 태그를 추출합니다.
-
==============================
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.
정규 표현식을 사용하여 img 태그 ( "] *>"와 같은 것)를 찾은 다음 각 img 태그에 대해 다른 정규 표현식을 사용하여 각 속성을 찾을 수 있습니다.
어쩌면 "([a-zA-Z] +) = \"([^ "] *) \" "와 같은 속성을 찾을 수 있습니다. 그러나 태그를 다루는 경우에는 따옴표가 없도록 할 수 있습니다 스프 ... 만약 당신이 그걸로 간다면, 당신은 매치마다 그룹들로부터 매개 변수 이름과 값을 얻을 수 있습니다.
-
==============================
21.
아마도 이것은 당신에게 올바른 대답을 줄 것입니다 :
<img.*?(?:(?:\s+(src)="([^"]+)")|(?:\s+(alt)="([^"]+)")|(?:\s+(title)="([^"]+)")|(?:\s+[^\s]+))+.*/>
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
'PHP' 카테고리의 다른 글
정수와 같은 이름을 가진 객체 속성에 액세스하는 방법? (0) | 2018.09.04 |
---|---|
mysql에 PHP 배열을 통해 여러 행 삽입 (0) | 2018.09.04 |
PHP를위한 최상의 XML 파서 [duplicate] (0) | 2018.09.04 |
PHP에서 배열을 어떻게 다시 색인합니까? (0) | 2018.09.04 |
"\ u00ed"와 같은 유니 코드 이스케이프 시퀀스를 올바른 UTF-8 인코딩 문자로 디코딩하는 방법? (0) | 2018.09.04 |