1

我试图了解更多关于环视断言的信息,我发现了这个线程,他们的解决方案应该适用于某些引擎,但不适用于 PHP,因为 PHP 要求环视断言是固定长度的。

我想要的是使相同的场景在 PHP 中工作,或者至少知道它是否可能。

我试图减少正则表达式规则的解释,所以它与我上面提到的线程中的不同,但它遵循相同的原则。

需要匹配一个字符串,内置三部分:

  • 以任意数量的字母数字字符开头
  • 不包含“abc-”后跟 3 到 5 个数字和/或连字符
  • 以“.htm”或“.html”结尾

因此,这些将匹配:

  • xxxyz-123.html
  • xx123-abc.htm
  • xxabc123.html
  • xxabc-123-45.htm

但这些不匹配:

  • xxabc-4324.htm
  • xxabc-1-2.html
  • xxac-12-34.txt
  • xxabc-12345.htm

我一直在尝试下面的正则表达式模式的一些变体,但它不起作用 - 由于固定长度限制,这种特殊情况:

.*(?<!abc-[\d-]{3,5})\.htm[^l]?$

我还使用了不同的测试字符串,忘记了 3-5 范围部分,只关注 3 个数字和/或连字符,并使用了下面的正则表达式,但它仍然不起作用,这就是为什么我决定寻求帮助:

.*(?<!abc-[\d-]{3})\.htm[^l]?$

你们中的任何人都可以在这里帮助我吗?

编辑

这是我的测试 PHP 代码:

$regex = "/^(?!.*abc-[\d-]{3,5})[a-zA-Z0-9-]+\.html?$/";

foreach ( $matching2 as $k => $v ) {
    $matches = preg_match( $regex, $v );

    echo '"', $v, '"', ( $matches != 0 ) ? ' matches' : ' doesn\'t match', '<br />';
}
4

2 回答 2

2

为什么你需要反过来看?为什么不只使用前瞻?

^(?!.*abc-[\d-]{3,5}[^\d-])[a-zA-Z0-9-]+\.html?$

这将简单地开始查看字符串的开头,并且前瞻尝试在字符串中的任何位置 ( .*) 找到不允许的字符串。如果是这样,前瞻会使模式失败。这还包括要求,该字符串仅由字母数字和连字符组成。

顺便说一句,这与您链接的问题使用的解决方案相同。Perl 也不能处理可变长度的lookbehinds。只有.NET 可以。

另一个注意事项:如果你遇到一个例子,你确实需要一个可变长度的lookbehind(但不是一个可变长度的lookahead)......反转字符串(当然还有模式)。;)

于 2012-11-19T22:49:27.007 回答
1

您可能正在寻找正则表达式模式

^(?!.*abc-[\d-]{3,5}[^\d-])[A-Za-z0-9].*[.]html?$
于 2012-11-19T23:28:25.547 回答