1

我一直在关注这个关于如何在 PHP 中检索所有标签的问题。

具体来说(在 wordpress 下),我想找到所有 <pre> 标签,以及所有可用信息(属性和文本)。但是,我似乎对preg_match不太熟练,所以我求助于您。

我的文本确实包含各种<pre>标签,有些带有属性,有些只带有文本。我的功能是这样的:

function getPreTags($string) {
    $pattern = "/<pre\s?(.*)>(.*)<\/pre>/";
    preg_match($pattern, $string, $matches);
    return $matches[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

您最好使用 DOM 解析器来解析 HTML。考虑这段代码:

$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 回答