Php正则表达式匹配html标签包含某个类名

时间:2015-02-17 22:34:24

标签: php regex html-parsing

我需要一个正则表达式匹配任何标签都有classname" share"

我想我非常接近。有了这个:

class=".*share.*"

我希望它与这些匹配:

<div class="share"></div>
<div class="sdfsd share sdfsdfsdf"></div>

但不是这些:

<div class="sdfsd dfdgdg" share></div>
<a class="icon-share export-to-csv-button"/>
<a class="fxac link" href="/share"/>

请访问:https://regex101.com/r/uU6dU0/2

2 个答案:

答案 0 :(得分:0)

就像我在评论中发布的那样,你不想用正则表达式来解析html。你应该在很少的情况下。通常,您将使用DOMDocument和XPath来查询元素(类似于css)。这将允许您获取内部文本,嵌套元素以及正则表达式无法轻松完成的更多内容。

但是,如果需要,这应该有效:

<?php
$text =<<<HTML
<div class="share"></div>
<div class="sdfsd share sdfsdfsdf"></div>
<div class="sdfsd dfdgdg" share></div>
<a class="icon-share export-to-csv-button"
<a class="fxac link" href="/share "
HTML;

preg_match_all('/<[^>]*class="[^"]*\bshare\b[^"]*"[^>]*>/i', $text, $matches);
echo '<pre>'.htmlentities(print_r($matches,1)).'</pre>';

输出:

Array
(
    [0] => Array
        (
            [0] => <div class="share">
            [1] => <div class="sdfsd share sdfsdfsdf">
        )

)

您可以在此处看到:http://codepad.viper-7.com/UjBvT8

答案 1 :(得分:-1)

使用此正则表达式:

class=([^=]*)([^(a-z|A-Z|0-9|\-|_)])share("|([^(a-z|A-Z|0-9|\-|_)]).*")

https://regex101.com/r/uU6dU0/4

编辑:这个更容易,不会匹配多个标签:

class=("|"([^"]*)\s)share("|\s([^"]*)")

https://regex101.com/r/uU6dU0/5

编辑2:一个改进版本,用于查找在任一侧使用单引号的类:

class=(("|')|("|')([^"']*)\s)top-menu(("|')|\s([^"']*)("|'))