我正在尝试匹配以特定字符串开头和结尾的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);
我应该如何创建我的中间正则表达式以仅匹配不包含分隔线的文本?
答案 0 :(得分:1)
如果你使用an expression like this,你应该得到你期望的结果(尽管有better ways to parse HTML):
(?:(?!<br/>).)*
对于类固醇,这基本上是.*
。 (?:...)
是一个“非捕获”组,用于将所有内容组合在一起以进行*
次重复。 (?!...)
是一个负面的预测,这意味着它确保在当前位置之前找不到<br/>
。所以,这个表达式确保没有<br/>
匹配下一个字符,然后重复!
在你的表达式[^(<br/>)]+
中,你误解了角色类的工作原理。这就是说任何字符匹配1次以上,只要它不在以下字符集中:(
,b
,r
,/
,{{1} },>
。也许this demo会更好地解释它。
答案 1 :(得分:0)
如果您希望匹配<br />
和?
之间的任何html文字:
不包含任何其他<br />
,然后此表达式有效:
<br\s?\/>\s*([0-9]{1,4})[.:)]((?:(?!<br\s?\/>).)*)\?
可能包含<br />
,但您只对删除了<br />
的文字感兴趣,那么您应该匹配<br />
和{{1}之间的所有内容像这样:
?
并删除带有字符串替换的<br\s?\/>\s*([0-9]{1,4})[.:)]([^?]*)\?
或其他内容。 Take a look at this demo。
在每种情况下,第一组将匹配您的项目符号点数,第二组将匹配项目符号后面的问题,假设您感兴趣。上述表达式允许不一致的标记,例如{{1 }},<br />
或<br>
或<br >
。