PHP 正则表达式preg_match找到多个值然后Preg_match_all


php regex preg_match find multiple values then Preg_match_all

我必须通过php regex在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 个值,则不执行任何操作

基本上

,从你的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

您可以在单个正则表达式中组合多个模式,并在括号中加入管道字符:

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