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. sub>
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.