如何找到第一个<体...使用 PHP 在文本中>标签


How to find the first <body .....> tag in a text using PHP?

我使用preg_match函数时不好

但我正在尝试使用它来查找第一个正文标签。

标记可以采用以下任何格式

<body class="blah">
<body style="blah: blahblah;">
<body>

我能够使用 preg_match() 来获取第一个和第二个示例。但是,它不适用于最后一个示例。找不到简单的<body>

这是我所做的。 $message是我尝试解析的字符串

$foundBody = preg_match('/<body(.*)>/i',$message, $bodyf);
        if($foundBody != false){
            $strPos = strpos($message, $bodyf[0]);
            echo $strPos .'<br><br>';
            echo $bodyf[0] . '<br><br>';
            echo strlen($bodyf[0]) . '<br><br>';

            if($strPos !== false){
                $message = substr($message, $strPos + strlen($bodyf[0]) );
            }               
        } 

注意:我不是在撬动解析 html 代码。我在这里尝试的只是解析电子邮件。我基本上想返回一个紧跟在标签之后的文本<body....>字符串的末尾。

对于所有三种情况,以下内容应在 <body> 标记的结束>之后打印内容:

$i=strpos($message, "<body");
$i=strpos($message, ">", $i);
echo substr($message, $i+1);

我要把这个解决方案扔在这里,然后在子弹和手榴弹开始飞行之前迅速逃跑......(避免与HTML相关的正则表达式已经成为SO的口头禅。

(作为记录,我同意HTML处理应该由正则表达式以外的其他东西完成。但是,玩正则表达式很有趣。如果 OP 想玩正则表达式......为什么不呢?

如果你已经在使用preg_match为什么不让preg_match为你做整个事情:

if (preg_match('/^(.*?)<body([^>]*)>(.*)$/', $message, $matches)) {
    echo "Everything before the body tag = <pre>".$matches[1]."</pre><br />";
    echo "Attributes of the body tag = <pre>".$matches[2]."</pre><br />";
    echo "Everything after the body tag = <pre>".$matches[3]."</pre><br />";
} else {
   echo "OOPS! No body tag in that email!<br />'n";
}

我想出了一种方法来做到这一点,而不必做正则表达式。我使用了 tidy() 类

$tidy = new tidy();
$message = $tidy->repairString($message, array( 'output-html' => true, 'show-body-only' => true ), 'utf8');

为此,应在 PHP 配置文件中启用整洁扩展