0

可能重复:
如何在 id 为第一个属性的 div 标签之间获取文本。仅使用正则表达式。

这是场景

我正在使用这个正则表达式来获取带有 id test1、tes2 或 test3 的 div 标签内的文本

<div id = "test1">text</div>
<div id = "test2">text</div>
<div id = "test3">text</div>

$id_value = "test1" or "test2" or "test3";
$regex = "#\<div id=\"".$id_value."\"\>(.+?)\<\/div\>#s";

我唯一的要求是在下面的场景中从 div 标签中获取文本

<div id="test" class="testing" style="color:red" etc etc .... more attributes >text</div>

即 id 是 div 标签的第一个属性,后面可以跟 n 个属性。如何仅通过正则表达式从此类标签中提取文本。

我什至试过

$regex = '#<div\s+.*?id="".$id_value."".*?>(.*?)</\s*div>#ims';

它在 $id_value = "test1" 时返回 div 标签的文本,但如果 $id_value="test2" 它返回节点 test1 和 test2 的文本值。如果 $id_value="test3" 它返回所有 3 个节点的文本值。我只需要与特定 id 相关的文本值。仅使用正则表达式。

请帮忙谢谢。

4

1 回答 1

6

不要使用 RegExp 解析 HTML。相反,请使用 PHP 的DOM 扩展,它可以正确解析任何类型的 HTML。

例子:

<?php

    $html = <<<HTML
<div id = "test1">text</div>
<div id = "test2">other text</div>
<div id = "test3">new text</div>
HTML;

    $id_list = array(
        "test1",
        "test2",
        "test3",
    );

    $doc = new DOMDocument();
    $doc->loadHTML($html);
    foreach ($id_list as $id) {
        $div = $doc->getElementById($id);
        if ($div == NULL) {
            echo "There's no element with an ID of $id<br>\n";
        }
        else {
            echo "$id's content is: " . $div->textContent . "<br>\n";
        }
    }

当且仅当您绝对必须使用 RegExp,这就是我想出的:

<?php

    $html = <<<HTML
<div id = "test1">text</div>
<div id = "test2">other text</div>
<div id = "test3">new text</div>
HTML;

    $id_list = array(
        "test1",
        "test2",
        "test3",
    );

    foreach ($id_list as $id) {
        $pattern = <<<REGEX
/
<div\s*                     #Opening Tag
(?:                         #Attributes before ID
    [a-z]+                  #Attribute name
    \s*=\s*                 #Equals
    (?:"[^"]*"|'[^']*')     #Attribute content
    \s*                     #Spaces?
)*                          #Many or none
(?:                         #ID Attribute
    id
    \s*=\s*
    (?:"$id"|'$id')         #Matches the ID
    \s*
)
[^>]*                       #Anything after ID
>                           #Closing Tag
([^<]*)                     #Actual content!
<\/div>
/xi
REGEX;

        preg_match_all($pattern, $html, $matches);
        var_dump($matches);
    }

请注意,如果您使用此代码,unh̶oly͘͘c̀h̶i͏l҉d 会哭出处女的血。<center> 不能坚持已经太晚了。

于 2012-08-02T17:35:40.453 回答