以特定字符串开始和结束的正则表达式,中间没有(其他)字符串


Regex that starts and ends with specific string, and does not have (other) string in the middle

我试图在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 />