[英]How do I use PHP regex to ignore some HTML if it exists?
我正在寫一些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 -->
區別在於第一個示例中的“ <!-BEGIN TEMPLATE ....”和第三個示例中的“ Bonus code:...”文本。
我想要的正則表達式只返回'<!-message,其中文本為“ ss:[...]”(有時也可以是“ ss = [...]”)。 理想情況下,它將去除所有多余的HTML並僅返回3個字符的座位(示例中為“ U71”;始終以LETTERnumnum的形式),但我對此並不在意,因為我可以始終strip_tags()以后再說。
到目前為止,這是我能夠弄清楚的(我對regex還是很陌生),但是它並沒有忽略“ Bonus code:[...]”條目:
preg_match('/.*<!-- message -->\s*<div id="post_message_[0-9]{7}">\s*(.*?)<!-- \/ message -->/s', $html, $matches);
有人可以告訴我如何做得更優雅,因為我顯然做錯了嗎?
您可以使用以下簡單的方法:
$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()
函數會將數組的內部指針前進到最后一個元素,並返回其值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.