1

PHPですべてのタグを取得する方法について、この質問に従っていました。

具体的には(ワードプレスの下で)、利用可能なすべての情報(属性とテキスト)を含むすべてのタグを見つけ たいと思います。しかし、私はpreg_matchにそれほど熟練していないようですので、あなたに頼っています。<pre>

私のテキストにはさまざまなタグ含まれてい<pre>ます。属性を持つものもあれば、テキストだけのものもあります。私の機能はこれです:

function getPreTags($string) {
    $pattern = "/<pre\s?(.*)>(.*)<\/pre>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

タグが1 つ だけのテストに縮小しましたが、 が表示され、理由がわかりません。これはテスト文字列です:<pre>count(getPreTags(myHTMLbody)) = 0

<pre class="wp-code-highlight prettyprint prettyprinted" style=""><span class="com">Whatever &lt;</span> I've written &gt;&gt; here <span class="something">should be taken care of</span></pre>

ヒントはありますか?

乾杯!

4

3 に答える 3

3

いつものように、HTML を正規表現で解析することは決してそれをカットするつもりはありません。考慮すべきことが非常に多くあります (タグスープ、間隔: <pre>== < pre >== <\n\t\sPrE\n\n>...)。どの正規表現も、ある時点で失敗します。そのため、すぐに利用できるパーサーなどがあります。

つまり、属性のないタグを含むすべてのDOMXPathタグが必要な場合に、他の回答が のインスタンスを使用するという問題を経験する理由がわかりません。 次のようなもっと単純なものを選びます。 pre

$dom = new DOMDocument;
$dom->loadHTML($htmlString);
$preTags = $dom->getElementsByTagName('pre');
foreach($preTags as $pre)
{
    echo $pre->nodeValue, PHP_EOL;
    if ($pre->hasAttributes())
    {//if there are attributes
        foreach($pre->attributes as $attribute)
        {
            //do something with attribute
            echo 'Attribute: ', $attribute->name, ' = ', $attribute->value, PHP_EOL;
        }
    }
}

利用可能なメソッドとプロパティは、次のページで簡単に見つけることができます。

于 2013-11-04T09:36:36.400 に答える
1

HTML を解析するには、DOM パーサーを使用することをお勧めします。次のコードを検討してください。

$html = <<< EOF
<a href="http://example.com/foo.htm" class="curPage">Click link1</a> morestuff
<pre>A    B    C</pre>
<a href="http://notexample.com/foo/bar">notexample.com</a> morestuff
<pre id="pre1">X    Y    Z</pre>
<a href="http://example.com/foo.htm">Click link1</a>
<pre id="pre2">1    2    3</pre>
EOF;

// create a new DOM object
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);

// select all pre tags with attributes
$nodelist = $xpath->query("//pre[@*]");

// iterate through selected nodes and print them
for($i=0; $i < $nodelist->length; $i++) {
    $node = $nodelist->item($i);
    var_dump($node->nodeValue);
}

出力:

string(11) "X    Y    Z"
string(11) "1    2    3"
于 2013-11-04T08:35:54.827 に答える
0

データが XML に準拠している場合は、XPATH 式を使用できます。

非常に簡単なもの:

<?xml version="1.0" encoding="UTF-8"?>
<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <pre>1</pre>
    <pre>2</pre>
    <pre>3</pre>
  </body>
</html>

そして、次のようなPHP:

<?php
        $xmldoc = new DOMDocument();
        $xmldoc->load('test.xml');

        $xpathvar = new Domxpath($xmldoc);

echo $xpathvar->evaluate('count(*//pre)');
?>

これは、html/xml スニペットでも機能するはずです。

于 2013-11-04T09:06:04.680 に答える