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

Php regex matches html tags contain a certain class name

我需要一个正则表达式来匹配任何具有类名的标签 "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

使用这个正则表达式:

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([^"']*)("|'))

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

但是,如果需要,这应该可行:

<?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