我试图在html文档中匹配字符串,以特定字符串开始和结束,并且在中间没有另一个特定字符串。更具体地说,它们以
开头$start = "<br/>'s*[0-9]{1,4}('.|':|'))+";
以
结尾$end = "'?";
和应该包含中间除断行以外的所有内容。
目前我的中间正则表达式是这样的:
$middle = "[^(<br/>)]+";
最终代码看起来像这样:
$start = "<br/>'s*[0-9]{1,4}('.|':|'))+";
$middle = //What do I put here?
$end = "'?";
$regex = "#".$start.$middle.$end."#";
preg_match_all($regex, $text, $hits);
我应该如何创建我的中间正则表达式只匹配不包含断行的文本?
如果您使用这样的表达式,您应该得到您期望的结果(尽管,有更好的方法来解析HTML):
(?:(?!<br/>).)*
这基本上是类固醇的.*
。(?:...)
是一个"非捕获"组,用于将所有内容分组在一起以进行*
重复。(?!...)
是一个负向前看,这意味着它确保<br/>
不会在当前位置之前被找到。所以,这个表达式确保没有<br/>
,然后匹配下一个字符,然后重复!
在你的表达式[^(<br/>)]+
中,你误解了字符类的工作方式。也就是说,匹配任何字符1+次,只要它不在以下字符集中:(
, b
, r
, /
, >
, )
。也许这个演示可以更好地解释
如果您希望匹配<br />
和?
之间的任何html文本:
-
不包含任何其他
<br />
,则此表达式有效:<br's?'/>'s*([0-9]{1,4})[.:)]((?:(?!<br's?'/>).)*)'?
看一下这个演示。
-
可能包含
<br />
,但你只对删除<br />
的文本感兴趣,那么你应该匹配<br />
和?
之间的所有内容,如下所示:<br's?'/>'s*([0-9]{1,4})[.:)]([^?]*)'?
和删除<br />
字符串替换或其他东西。看看这个演示。
在每种情况下,第一组将匹配你的项目符号编号,第二组将匹配项目符号后面的问题,假设这是你感兴趣的。上述表达式允许不一致的标记,如<br>
、<br >
或<br/>
或<br />
。