使用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....>
标签后立即返回文本到字符串的末尾。
答案 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配置文件中启用整理扩展