많은 HTMl이 포함 된 문자열에서 <h1><h2>etc
태그의 모든 텍스트를 새 변수로 추출하는 방법은 무엇입니까?PHP에서 헤딩 태그를 문자열에서 추출하는 방법
아마도 preg_match_all을 사용하고 쉼표로 구분 된 단일 변수로 일치 항목을 보냅니다.
감사합니다.
많은 HTMl이 포함 된 문자열에서 <h1><h2>etc
태그의 모든 텍스트를 새 변수로 추출하는 방법은 무엇입니까?PHP에서 헤딩 태그를 문자열에서 추출하는 방법
아마도 preg_match_all을 사용하고 쉼표로 구분 된 단일 변수로 일치 항목을 보냅니다.
감사합니다.
, 나는 생각 . 다른 사람들이 말했듯이 HTML을 제어하지 못하는 경우 정규식을 사용하는 것이 좋지 않습니다.
"HTML에서 물건을 추출하는 방법"질문은 정규식을 사용하는 것이 아닙니다. 대신 Robust, Mature HTML Parser for PHP에 대한 토론을 참조하십시오.
는 당신이 HTML 파서를 사용하여 아마 더 좋을 것 같아 뭔가 SimpleHTMLDOM parser
나는이 점에서 regexp가 더 나은 것으로 나타났습니다. DOM 파서는 HTML 또는 잘못된 HTML 구조가 깨진 웹 페이지에서는 다소 신뢰할 수 없습니다. –
을이 작업에 대한 정규식을 사용하고 사용하지 않는 것이 좋습니다. 하지만 실제로는 단순한 시나리오, 이런 일을 할 수 있습니다
preg_match_all('/<h[0-6]>([^</h[0-6]>*)</h/i', $string, $matches);
만큼 헤더 태그가 중첩되지 않는 한 작동합니다 : 당신은 실제로 정규 표현식을 사용하려면
if (preg_match_all('/<h\d>([^<]*)<\/h\d>/iU', $str, $matches)) {
// $matches contains all instances of h1-h6
}
PHP 5.3.5에서이 스 니펫을 사용할 때'preg_match_all() : 알 수없는 수정 자 'h'가 있습니다. 그 오류를 해결하기 위해 파이프 기호로 정규 표현식 경계를 대체했습니다 :' '|
또한 DOMDocument
PHP 클래스를 고려하십시오.
$domdoc->getElementsByTagName('h1')
을 사용하여 표제를 가져올 수 있습니다.
먼저 당신은 깔끔한로 (예제에서 $ html_str) HTML을 정리해야합니다
$tidy_config = array(
"indent" => true,
"output-xml" => true,
"output-xhtml" => false,
"drop-empty-paras" => false,
"hide-comments" => true,
"numeric-entities" => true,
"doctype" => "omit",
"char-encoding" => "utf8",
"repeated-attributes" => "keep-last"
);
$xml_str = tidy_repair_string($html_str, $tidy_config);
그런 다음 당신이있는 DOMDocument로 XML ($ xml_str를)로드 할 수
$doc = DOMDocument::loadXML($xml_str);
그리고 마지막으로 당신은 Horia 드라고 미르의 방법을 사용할 수 있습니다
$list = $doc->getElementsByTagName("h1");
for ($i = 0; $i < $list->length; $i++) {
print($list->item($i)->nodeValue . "<br/>\n");
}
을 또는 당신은 또한 더 복잡한 쿼리에 대한 XPath를 사용할 수 있습니다 있는 DOMDocument에 그러나 내가 공동으로 제목 태그를 잡을 수 있었다 최선의 방법을 언급하고 싶었, 나는이 슈퍼 이전 게시물 알고
$xpath = new DOMXPath($doc);
$list = $xpath->evaluate("//h1");
당신은 어떻게해야합니까 어떤 오류 나는 예를하려고하면 예상대로 작동 제공? 및 인쇄 "테스트"유일한 변경 존재와 위의 모든 코드에서와 같이 – CodeAddict
: $는 xml_str = tidy_repair_string ('는
(http://www.php.net/manual/en/class.domxpath.php 참조).
이 방법은<h1>title</h1> and <h2>title 2</h2>
(정규식로 작동은하지만 PHP는 약간 다르게 작동한다.) 귀하는 preg_match에서
/<\s*h[1-2](?:.*)>(.*)</\s*h/i
사용이
|<\s*h[1-2](?:.*)>(.*)</\s*h|Ui
$group[1]
지금까지 무엇을 포함 할 것이다 heading 태그 사이. $group[0]
이이 공간을 차지합니다 모든 <h1>test</h
이며, 누군가가 "클래스/ID가"
<h1 class="classname">test</h1>
클래스/ID (그룹)를 추가하는 경우 무시됩니다.
: HTML 태그를 분석 할 때 필자는 항상 흰 공백, 줄 바꿈, 탭 등을 1 개의 공백으로 제거하고 바꿉니다. 이것은 멀티 라인, 닷올 (dotsall)을 최소화합니다 ... 그리고 매우 큰 양의 공백 (white space)은 어떤 경우에는 정규 표현식으로 엉망이 될 수 있습니다.
나는 당신이 전체 요소를 움켜 잡지 못하고 닫는 태그를 자르지 않을 것임을 의미한다고 생각한다.> 또한 (| *. *)> (. *)\s*h[1-2]> | Ui' 표제에 줄 바꿈 문자 ('
')가 있으면 사용자 생성 콘텐츠로 작업하는 경우 완전히 가능합니다. –
cameronjonesweb
난 그냥 내 솔루션을 공유 할 테스트 페이지에 대한 링크입니다 :
function get_all_headings($content) {
preg_match_all('/\<(h[1-6])\>(.*)<\/h[1-6]>/i', $content, $matches);
$r = array();
if(!empty($matches[1]) && !empty($matches[2])){
$tags = $matches[1];
$titles = $matches[2];
foreach ($tags as $i => $tag) {
$r[] = array('tag' => $tag, 'title' => $titles[ $i ]);
}
}
return $r;
}
제목이 발견되거나이 같은되지 않은 경우는 하늘의 배열을 반환합니다이 기능 :
array (
array (
'tag' => 'h1',
'title' => 'This is a title',
),
array (
'tag' => 'h2',
'title' => 'This is the second title',
),
)
예를 들면? 'article'div 클래스 안에 모든 제목 태그를 가져와야합니다. 항상 DOm에 대해 혼란 스러워요 – bluedaniel