0

我有以下两种类型的文本:

类型一:

<div class="meta-name">Corporate Officers</div>
<div class="meta-data"><table border="0" cellspacing="0" cellpadding="0" width="171">
<col width="171"></col>
<tbody>
<tr height="19">
<td width="171" height="19">Officer One</td>
</tr>
</tbody>
</table> 
</div>
</div>

类型二:

<div class="meta-name">Corporate Officers</div>
<div class="meta-data">Officer Two</div>
</div>
<pre>

我正在使用 php 和preg_match_all. 我需要一个可以从上面返回一号警官和二号警官的表达式。我使用公司官员< /div>作为第一个主播和< /div>第二个主播,但我无法在所有桌子上的胡言乱语中找到 Keith Dennis。

如何在anchor1 和anchor2 之间返回文本,同时忽略任何括号内的所有文本<>

我看到了这些线程,但无法使他们的解决方案对我有用: RegEx:提取所有内容,直到 X 不在两个大括号之间

一切,但 [ 和 ] 之间的一切

4

3 回答 3

1

使用SimpleXML

$xml = new SimpleXMLElement('<div>
    <div class="meta-name">
        Corporate Officers
    </div>
    <div class="meta-data">
        <table border="0" cellspacing="0" cellpadding="0" width="171">
            <col width="171" />
            <tbody>
                <tr height="19">
                    <td width="171" height="19">
                        Officer One
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
');

$results = array();
foreach($xml->children() as $node) {
    if($node->getName() == 'div') {
        $attributes = $node->attributes();
        $classes = explode(' ', $attributes['class']);
        if(in_array('meta-name', $classes) || in_array('meta-data', $classes)) {
            $results[] = getText($node);
        }
    }
}

function getText($node) {
    $text = trim(sprintf('%s', $node));
    if(strlen($text) !== 0) {
        return $text;
    }

    foreach($node->children() as $child) {
        if($text = getText($child)) {
            return $text;
        }
    }

    return null;
}

var_dump($results);

作为一般的经验法则,永远不要使用 Regex 来解析 HTML。

于 2011-11-19T22:27:38.540 回答
0

大约 80% 的正则表达式问题是关于 xml/html/xhtml。大约 75% 的答案是使用正则表达式。为什么?因为虽然它似乎适用于您的示例,但它会很脆弱,并且可能会因输入的轻微变化而中断。

请看看这个漂亮的工具。如果您不能使用它,请回来,我们将提供帮助。

于 2011-11-19T22:04:21.097 回答
-1

试试这个正则表达式:

'~<div\b[^>]*>Corporate\s+Officers</div>\s*<div\b[^>]*>(?:<(?!/?div\b)[^>]*>|\s+)*\K[^<]+~'

<div>这是基于在 HTML 中的开始标记和您要查找的名称之间没有其他文本内容的假设。第一部分是不言自明的:

<div\b[^>]*>Corporate\s+Officers</div>\s*<div\b[^>]*>

我假设“公司官员”文本足以定位起点,但class如有必要,您可以重新插入属性。在那之后,

(?:<(?!/?div\b)[^>]*>|\s+)*

<div>...使用除or标签之外的任意数量的</div>标签,以及任何中间空格。然后\K走过来说忘记这一切,真正的比赛从这里开始[^<]+消耗直到下一个标签开头的所有内容,这就是您在匹配结果中看到的所有内容。就好像之前的一切都是\K一个积极的回顾,但没有所有的限制。

这是一个演示

于 2011-11-20T11:00:13.093 回答