PHP Regex:在Html中匹配特定单词

时间:2017-03-15 19:07:53

标签: php regex preg-match preg-match-all

我有这个HTML代码:

<html>
<div class="the_grp">
<h3>heading <span id="sn-sin" class="the_decs">(keyword: <i>cat</i>)</span></h3>
<ul>
    <li>
        <div>
            <div><span class="w_pos"></span></div>
            <div class="w_the">
            <a href="http://www.exampledomain.com/20111/cute-cat">cute cat</a>, 
            <a href="http://www.exampledomain.com/7456/catty">catty</a>, 
            </div>
        </div>
    </li>   
    <li>
        <div>
            <div><span class="w_pos"></span></div>
            <div class="w_the">
            <a href="http://www.exampledomain.com/7589/sweet">sweet</a>, 
            <a href="http://www.exampledomain.com/10852/sweet-cat">sweet cat</a>, 
            <a href="http://www.exampledomain.com/20114/cat-vs-dog">cat vs dog</a>, 
        </div>
    </li>
</ul>
</div>

<a id="ant"></a>
<div class="the_grp">
<h3>another heading <span id="sn-an" class="the_decs">(ignore this: <i>cat</i>)</span></h3>
<ul>
    <li>
        <div>
            <div><span class="w_pos"></span></div>
            <div class="w_the"><a href="http://www.exampledomain.com/118/bad-cat">bad cat</a></div>
        </div>
    </li>
</ul>
</div>

我想匹配html代码中的以下单词:

  • 可爱的猫咪
  • 甜蜜的猫咪
  • 猫与狗

我正在使用这种模式并捕获[2]来获取这些词:

#<a href="http\:(.*?)">(.*?)<\/a>#i

我的php代码看起来像这样:

preg_match_all('#<a href="http\:(.*?)">(.*?)<\/a>#i', $data, $matches);
echo '<pre>';
print_r($matches[2]);
echo '</pre>';

那种模式匹配&#34;坏猫&#34;太。如何只捕捉以下这些词:可爱的猫咪,猫,甜,甜猫,猫与狗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

最好只使用HTML解析器。以下是使用http://simplehtmldom.sourceforge.net/进行操作的方法。

file_get_html最好是,它基本上会调用file_get_contents和str_get_html

str_get_html是如何将字符串解析为一个简单的html dom对象。

<?php

require('simple_html_dom.php');

$html = str_get_html(/*your html here*/);

foreach($html->find('a') as $element) 
       echo $element->plaintext  . '<br>';

?>

如果你不想让坏猫匹配,只需循环搜索结果并以这种方式删除/忽略它。

如果你想删除bad cat

foreach($html->find('a') as $element) 
    if ($element->plaintext != "bad cat")
       echo $element->plaintext  . '<br>';