我使用以下正则表达式来匹配所有的1 1bhp或12 1bhp或123 1bhp或1234 1bhp。我不知道这是否是最好的写作方式,但它是有效的。
preg_match_all('/(\d{1}|\d{2}|\d{3}|\d{4})bhp/', $str2b, $bhps);但是,如果它不匹配任何内容,我想匹配
<td class="something">THIS</td>
我知道它的正则表达式是!<td class="something">(.*?)</td>!is
我的问题是,我很难在第一个正则表达式中有一个优先级,如果bhp找不到任何东西,那么就无法匹配始终存在的<td>的内容。
谢谢
编辑重要的
您可以在这里找到http://codepad.org/AZ4g6HDZ的一部分,第二个tr块没有必和必拓,所以它得到了下一个。因此,考虑到这一点,如果没有必和必拓在同一<tr>上找到必和必拓之后的必和必拓,我可以接受。
发布于 2013-10-14 22:58:08
'/\d{1,4}bhp/'会和你的第一次正则表达式完全一样。如果要匹配div (如果该正则表达式不匹配),则将其括在括号中,并使用|将它们相加在一起。这就产生了:
'/(\d{1,4}bhp|<td class="something">(.*?)<\/td>)/'编辑:检查这里是否是您想要的结果:http://regex101.com/r/pV1gB5 (所有行都匹配)
发布于 2013-10-14 23:25:30
我想这就是你想要的:
<?php
$str2b = '<td class="something">THIS</td>';
// or maybe this: $str2b = '1234bhp';
preg_match_all('/(\d{1}|\d{2}|\d{3}|\d{4})bhp/', $str2b, $bhps);
if( empty($bhps[0]) ) {
preg_match_all('!<td class="something">(.*?)</td>!is', $str2b, $bhps);
}
var_dump($bhps);
?>因此,preg_match_all将完全模式匹配放入$bhps[0]中。如果没有匹配,它就是空的。然后,我们检查您的第二个正则表达式,如果是的话。
正如在另一个答案中提到的,您还可以通过使用/(\d{1,4})bhp/来修复您的第一个正则表达式以提高效率。
此外,您应该考虑是需要preg_match_all还是只需要常规preg_match。
发布于 2013-10-15 01:42:07
这也许能行
$string = '
# removed to reduce noise
';
preg_match_all (
'~<td\ class="details">(?|(?:(?!</?td>).)*?(\d{1,4}bhp)(?:(?!</?td>).)*?|((?:(?!</?td>).)*?))</td>~s',
$string,
$matches,
PREG_PATTERN_ORDER
);
print_r( $matches[1] );
------------------------
Result:
Array
(
[0] => 102bhp
[1] =>
<div class="attribs">
??µ?????a/Sedan
1800cc,
Manual,
?e?????,
Ga?????,
</div>
[2] => 1bhp
)regex使用分支重置,在这里它是展开的,并带有边距注释-
<td\ class="details">
(?|
(?:
(?! </?td> )
.
)*?
br 1 ( \d{1,4} bhp ) # (1)
(?:
(?! </?td> )
.
)*?
|
br 1 ( # (1 start)
(?:
(?! </?td> )
.
)*?
1 ) # (1 end)
)
</td>https://stackoverflow.com/questions/19370551
复制相似问题