我正在编写一些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);
有人能告诉我如何更优雅地做到这一点,因为很明显我做得不对吗?
答案 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()
函数将数组的内部指针前进到最后一个元素,并返回其值。