【问题标题】:php regex preg_match find multiple values then Preg_match_all [duplicate]php regex preg_match 找到多个值然后 Preg_match_all [重复]
【发布时间】:2016-02-23 02:49:43
【问题描述】:

我必须通过 php 正则表达式在 HTML 页面中的特定标签之间找到一个值。但我希望如果 HTML 页面包含多个值,则执行 preg_match_all 否则什么也不做。

例如,如果preg_match 在 HTML 中找到 4 个值,则在下一阶段执行 preg_match_all,否则如果是 preg_match,则仅找到 1 个标记值然后什么也不做。

<td class"page"> 
<span class="my-tag">value1</span>
<span class="my-tag">value2</span>
<span class="my-tag">value3</span>
<span class="my-tag">value4</span>
</td>
preg_match('/<td class"page">(.*?)<\/td>/s';)
now do preg_match_all in next phase because preg_match find 4 values

preg_match_all('|\<span class="my-tag"\>(.*?)\</span\>|', $html, $string);

and if HTML contain only 1 value like this 
<td class"page"> 
<span class="my-tag">value1</span>
</td>

所以如果 HTML 只包含 1 个值,那么什么都不做

【问题讨论】:

  • 除非你正在处理一组永远不会改变的 HTML 文件,否则用正则表达式解析 HTML 是一条悲伤之路。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关原因的示例,请参见 htmlparsing.com/regexes使用正确的 HTML 解析模块。请参阅this SO thread,了解如何使用已经编写、测试和调试过的 PHP 模块正确解析 HTML。

标签: php html-parsing preg-match preg-match-all


【解决方案1】:

基本上,从你的preg_match,你会得到一个如下所示的字符串:

Array
(
    [0] => <td class="page"> 
<span class="my-tag">value1</span>
<span class="my-tag">value2</span>
<span class="my-tag">value3</span>
<span class="my-tag">value4</span>
</td>
    [1] =>  
<span class="my-tag">value1</span>
<span class="my-tag">value2</span>
<span class="my-tag">value3</span>
<span class="my-tag">value4</span>

)

这样,我们就可以继续进行匹配 - 无论它是只找到一个匹配项还是多个匹配项。 (因为匹配一个或四个项目不会有任何损害,我建议在你的代码中将逻辑向下移动。)然后我们可以计算它找到了多少并将其存储在一个名为 $count 的变量中。

// CHECK TO SEE IF WE FOUND A MATCH
if (isset($matches[1])) {

    // GO AHEAD AND DO THE MATCH ON THE SPANS
    preg_match_all('~<span class="my-tag">(.*?)</span>~s', $string, $span_matches);
    $count = count($span_matches[1]);


    // IF WE FOUND MULTIPLE MATCHES, LIST THEM OUT
    if ($count > 1) {
        print 'COUNT IS: '.$count;
        print_r($span_matches[1]);
    }
    // WE DID NOT MATCH ANY SPAN TAGS
    elseif ($count == 0) {
        print 'COUNT IS ZERO - CRAP';
    }
    // IF WE ONLY FOUND ONE MATCH, WE DON'T NEED TO DO ANYTHING
    else {
        print 'COUNT IS EXACTLY 1 - DO NOTHING';
    }

}
// WE DID NOT FIND AN INITAL MATCH TO BEGIN WITH
else {
    print 'WE DID NOT FIND A MATCH';
}

从那里,它只是一个简单的 if/else 语句来做你想做的事。

这是一个工作演示:

http://ideone.com/SiPiOx

【讨论】:

    【解决方案2】:

    您可以在单个正则表达式中将多个模式与括号中的竖线字符组合:

    preg_match('/(cats?|dogs?|re.*tion)/', $string, $matches);
    

    【讨论】:

    • 你在回答什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多