如果存在,我如何使用PHP正则表达式忽略某些HTML?

时间:2015-09-08 00:42:20

标签: php html regex

我正在编写一些PHP,它会刮掉一个网页并在存在时返回一个非常小的值。

我将收到的HTML有时看起来像:

<!-- message -->
<div id="post_message_5400147">
<!-- BEGIN TEMPLATE: ad_showthread_firstpost_start -->

<!-- END TEMPLATE: ad_showthread_firstpost_start -->
                ss:<font size="5"><b><font size="5"><font size="5"> U71</font></font></b></font>
</div>
<!-- / message -->

有时会看起来像:

<!-- message -->
<div id="post_message_5400147">

    ss:<font size="5"><b><font size="5"><font size="5"> U71</font></font></b></font>
</div>
<!-- / message -->

有时看起来像:

<div id="post_message_5400752">

    Bonus code: SKATE
</div>
<!-- / message -->

区别在于&#39;&lt;! - BEGIN TEMPLATE ....&#39;第一个例子中的内容,以及&#34; Bonus代码:...&#34;第三篇文字。

我希望正则表达式做的只是返回&#39;&lt;! - 消息&#39; s文本是&#34; ss:[...]&#34; (有时它也可以是&#34; ss = [...]&#34;)。理想情况下,它会删除所有无关的HTML,而只是返回3个字符的座位(&#34; U71&#34;在示例中;总是以LETTERnumnum的形式)但我不会&#39;我真的非常关心这一点,因为我总是可以在晚些时候将它删除。

到目前为止,这是我能够弄清楚的(我对正则表达式来说很新)但是它并没有忽略&#34; Bonus代码:[... ]&#34;条目:

preg_match('/.*<!-- message -->\s*<div id="post_message_[0-9]{7}">\s*(.*?)<!-- \/ message -->/s', $html, $matches);

有人能告诉我如何更优雅地做到这一点,因为很明显我做得不对吗?

1 个答案:

答案 0 :(得分:-2)

你可以使用这样简单的东西:

$p = '/> (\w{1}\d{2})</';

示例:

$s = <<<EOT
 <!-- message -->
 <div id="post_message_5400147">
 <!-- BEGIN TEMPLATE: ad_showthread_firstpost_start -->
 <!-- END TEMPLATE: ad_showthread_firstpost_start -->
    ss:<font size="5"><b><font size="5"><font size="5"> U71</font></font></b></font>
 </div>
 <!-- / message -->
EOT;

$p = '/> (\w{1}\d{2})</';
preg_match($p,$s,$m);
var_dump($m[1]);

输出:

U71

要查找所有匹配项并获取最后一项匹配项,您可以执行以下操作:

$s = "<test> U71</test>some junk here <span> Z23</span>";
$p = '/> (\w{1}\d{2})</';
preg_match_all($p,$s,$m);
var_dump(end($m[1]));

输出:

Z23

end()函数将数组的内部指针前进到最后一个元素,并返回其值。