正则表达式以特定字符串开头和结尾,并且中间没有(其他)字符串

时间:2015-09-22 14:44:19

标签: php regex string

我正在尝试匹配以特定字符串开头和结尾的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);

我应该如何创建我的中间正则表达式以仅匹配不包含分隔线的文本?

2 个答案:

答案 0 :(得分:1)

如果你使用an expression like this,你应该得到你期望的结果(尽管有better ways to parse HTML):

(?:(?!<br/>).)*

对于类固醇,这基本上是.*(?:...)是一个“非捕获”组,用于将所有内容组合在一起以进行*次重复。 (?!...)是一个负面的预测,这意味着它确保在当前位置之前找不到<br/>。所以,这个表达式确保没有<br/>匹配下一个字符,然后重复!

在你的表达式[^(<br/>)]+中,你误解了角色类的工作原理。这就是说任何字符匹配1次以上,只要它不在以下字符集中:(br/,{{1} },>。也许this demo会更好地解释它。

答案 1 :(得分:0)

如果您希望匹配<br />?之间的任何html文字:

  • 不包含任何其他<br />,然后此表达式有效:

    <br\s?\/>\s*([0-9]{1,4})[.:)]((?:(?!<br\s?\/>).)*)\?

Take a look at this demo

  • 可能包含<br />,但您只对删除了<br />的文字感兴趣,那么您应该匹配<br />和{{1}之间的所有内容像这样:

    ?

并删除带有字符串替换的<br\s?\/>\s*([0-9]{1,4})[.:)]([^?]*)\?或其他内容。 Take a look at this demo

在每种情况下,第一组将匹配您的项目符号点数,第二组将匹配项目符号后面的问题,假设您感兴趣。上述表达式允许不一致的标记,例如{{1 }},<br /><br><br >