Bu nasıl PCRE model palindrom algılar?

0 Cevap php

This question is an educational demonstration of the usage of lookahead, nested reference, and conditionals in a PCRE pattern to match ALL palindromes, including the ones that can't be matched by the recursive pattern given in the PCRE man page.

PHP kod parçasında bu PCRE'nin desenini inceleyin:

$palindrome = '/(?x)
^
  (?:
      (.) (?=
              .*
              (
                \1
                (?(2) \2 | )
              )
              $
          )
  )*
  .?
  \2?
$


/';

Bu model tespit palindrom gibi görünüyor, bu test durumlarda da görüldüğü gibi (see also on ideone.com):

$tests = array(
  # palindromes
  '',
  'a',
  'aa',
  'aaa',
  'aba',
  'aaaa',
  'abba',
  'aaaaa',
  'abcba',
  'ababa',

  # non-palindromes
  'aab',
  'abab',
  'xyz',
);

foreach ($tests as $test) {
  echo sprintf("%s '%s'\n", preg_match($palindrome, $test), $test);  
}

Peki bu model çalışır?


Notes

Bu model, kullanılan benzer bir teknik olan, bir nested reference kullanır How does this Java regex detect palindromes? , but unlike that Java pattern, there's no lookbehind (but it does use a conditional).

Ayrıca, PCRE man page bazı palindrom maç için bir özyinelemeli desen sunar unutmayın:

# the recursive pattern to detect some palindromes from PCRE man page
^(?:((.)(?1)\2|)|((.)(?3)\4|.))$

İç içe başvuru / pozitif, ama -: man sayfasında bu özyinelemeli model (1 kez ve also on ideone.com Why will this recursive regex only match when a character repeats 2n? Bakınız) tüm palindrom algılayamaz konusunda uyarıyor Bu soru can sunulan lookahead desen.

0 Cevap