我使用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 配置文件中启用整洁扩展