【问题标题】:Regex - Grab a specific word within specific tags正则表达式 - 在特定标签中抓取特定单词
【发布时间】:2010-07-26 06:22:41
【问题描述】:

我不认为自己是 PHP “菜鸟”,但正则表达式对我来说仍然是新事物。

我正在做一个 CURL,我收到一个 cmets 列表。每条评论都有这样的 HTML 结构:

<div class="comment-text">the comment</div>

我想要的很简单:我想从 preg_match_all 中获取在这个特定的 DIV 标记中包含“cool”一词的 cmets。

到目前为止我所拥有的:

preg_match_all("#<div class=\"comment-text\">\bcool\b</div>#Uis", $getcommentlist, $matchescomment);

很遗憾,这不起作用。但如果正则表达式只是#\bcool\b#Uis,它会起作用。但我真的很想在这些标签中捕捉到“酷”这个词。

我知道我可以执行 2 个正则表达式(一个获取所有 cmets,另一个过滤每个 cmets 以捕获“酷”一词),但我想知道如何在一个 preg_match_all 中执行此操作?

我认为我离解决方案不远,但不知何故我就是找不到。肯定少了点什么。

感谢您的宝贵时间。

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    这应该会给你你想要的东西,如果你想稍微改变一下,它会提供一些灵活性:

    $input = '<div class="comment-text">the comment</div><div class="comment-text">cool</div><div class="comment-text">this one is cool too</div><div class="comment-text">ool</div>';
    $class="comment-text";
    $text="cool";
    $pattern = '#<div class="'.$class.'">([^<]*'.$text.'[^<]*)</div>#s';
    preg_match_all($pattern, $input, $matches);
    

    显然,您需要将输入设置为$input 的值。运行后,匹配的&lt;div&gt;s 数组将在$matches[0] 中,匹配的文本数组将在$matches[1]

    您可以通过分别更改 $class$text 值来更改要匹配的 div 类或需要的 div 内文本。

    【讨论】:

    • (已编辑:没有看到 preg_match_all 的“_all”)...您也不应该需要 s 修饰符(单行模式),因为正则表达式中没有任何句点。
    • @Tim:s 修饰符只是为了防止输入包含跨越多行的 html 块。对于 OP 或我自己指定的输入,这不是必需的,但可能存在其他情况。
    • 正如预期的那样,它运行良好。感谢您的回答一百万,如果我没有早点回复,我很抱歉,我在睡觉前大约一个小时发布了这个。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2021-04-20
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多