如何使用PHP在文本中找到第一个标签?

时间:2015-03-16 20:31:45

标签: php html regex

使用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....>标签后立即返回文本到字符串的末尾。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我要把这个解决方案扔到这里,然后在子弹和手榴弹开始飞行之前迅速逃跑......(与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";
}

答案 2 :(得分:0)

我想出了一种方法,无需使用正则表达式。我使用了tidy()

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

要在PHP配置文件中启用整理扩展