【问题标题】:Best way to match text between tags with attributes将标签之间的文本与属性匹配的最佳方法
【发布时间】:2017-03-29 07:52:09
【问题描述】:

我正在尝试获取两个标签之间的所有文本。文档中会有多个标签对,所以我需要获取所有条目。

这是一个文本示例

<pre class="code-class" id="code-error">
function error_notice() {
    ?>
    <div class="error notice">
        <p><?php _e( 'There has been an error', 'my_textdomain' ); ?></p>
    </div>
    <?php
}
add_action( 'admin_notices', 'my_error_notice' );
</pre>

如您所见,&lt;pre&gt; 标记内有嵌套代码本身具有 HTML,但我需要捕获 &lt;pre&gt; 标记之间的所有文本。例如,我还想解析属性classid

我尝试使用 DOMDocument 解析此文本

$dom = new DOMDocument;
$dom->loadHTML($htmlString);
$preTags = $dom->getElementsByTagName('pre');
foreach($preTags as $pre)
{

但是嵌套的 HTML 被解析为单独的节点。

我也尝试过使用正则表达式,但无法解析所有可能的属性。

请提出解析和考虑所有可能情况的最佳方法。

【问题讨论】:

  • 这个 &lt;pre class="code-class" id="code-error"&gt; function error_notice() { ?&gt; 看起来像无效的 PHP。这是您的实际代码还是经过精简和页面前执行?

标签: php html regex parsing dom


【解决方案1】:

使用它来捕获 pre 标签内的所有内容:

<pre.*?>(.*?)<\/pre>

捕获组 1 包含您要查找的内容

在整个字符串上尝试这个正则表达式,并获取捕获组 1 中每个匹配项的类和 ID

class="(.*?)"|id="(.*?)"

Try here

Run the php sample here

【讨论】:

  • 我不会说正则表达式是带有 HTML 的best approach
  • 感谢您的回答,但正如之前的评论中提到的,正则表达式可能会导致性能下降。
【解决方案2】:
$input_lines= YOUR CODE;
preg_match_all("/<pre[^>]*>(.*?)<\/pre>/is", $input_lines, $output_array);
print_r($output_array);

演示http://www.phpliveregex.com/p/hSB

【讨论】:

    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多