我必须通过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);