簡體   English   中英

我如何使用PHP正則表達式忽略某些HTML(如果存在)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM