【问题标题】:Php regex matches html tags contain a certain class namephp正则表达式匹配html标签包含某个类名
【发布时间】:2015-04-18 19:05:03
【问题描述】:

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

【问题讨论】:

  • @CasimiretHippolyte 也不是
  • 除了强制性的“不要用正则表达式解析 html”之外,这样的东西应该适用于大多数人:/&lt;[^&gt;]*class="[^"]*\bshare\b[^"]*"[^&gt;]*&gt;/si。这只有在类被双引号括起来时才有效。
  • 正则表达式不是要走的路。拥有它们后你想做什么?
  • 那么,你是想像你的问题所说的那样匹配标签,还是像你的示例所示的那样匹配其他类?
  • 我在 IntelliJ 搜索中使用正则表达式来匹配具有类名“share”cl.ly/ZpTY 的标签

标签: php regex html-parsing


【解决方案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([^"']*)("|'))

【讨论】:

  • 您可能希望通过在星号后面添加一个问号来将星号固定为非贪婪。否则你可能会匹配多个标签。
  • 我看不到您的正则表达式如何满足 OP 的预期
  • @hwnd:这正是他想要得到的
  • 我想知道为什么这个稍微简单一点的版本也不起作用:class=("|"[^"]*\s)line("|\s[^"]*")。它似乎对我有用。它所做的只是删除在所需选择器之前和之后的潜在附加类选择器名称周围的分组括号。
  • 对我之前的建议的进一步改进:我最初的建议仅适用于使用双引号的类属性。要处理这两种情况,请使用以下命令: class=(("|')|("|')([^"']*)\s)share(("|')|\s([^"'] *)("|'))。请注意,它还会发现引号不匹配的情况;但是,根据问题,这不是问题。
【解决方案2】:

就像我在评论中发布的那样,您不想使用正则表达式解析 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

【讨论】:

  • 我在 IntelliJ 搜索中使用正则表达式来匹配具有类名“share”cl.ly/ZpTY 的标签,而你的也可以
  • 谢谢,我用这个作为0 !== preg_match('/&lt;[^&gt;]*class=["\'][^"]*\bfa\b[^"]*["\'][^&gt;]*&gt;/i', BREADCRUMBS_SPACER)。它的作品!
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多