问题
I'm trying to match for plain text here is the regex
$variable = "newteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststorynewteststory";
$result = preg_match('/^([a-zA-Z0-9 \n\r,!@#\$\.\+\-%\^&\(\)~`\'":;_=\?\\/\|\<\>\*\{\}])+$/',$variable);
and it fails and I can't figure out why
回答1:
A few suggestions to try:
Move the
+inside of the capture group so it needs to do less internal shifting.$result = preg_match('/^([a-zA-Z0-9 \n\r,!@#\$\.\+\-%\^&\(\)~`\'":;_=\?\\/\|\<\>\*\{\}]+)$/',$variable);Why capture at all?
$result = preg_match('/^[a-zA-Z0-9 \n\r,!@#\$\.\+\-%\^&\(\)~`\'":;_=\?\\/\|\<\>\*\{\}]+$/',$variable);Why not just negate so it doesn't need to build up the internal state:
$result = !preg_match('/[^a-zA-Z0-9 \n\r,!@#\$\.\+\-%\^&\(\)~`\'":;_=\?\\/\|\<\>\*\{\}]/',$variable);
What I think's happening is that you're over-running the internal buffer that pcre is using to keep track of the state. Give a try using a negated preg match (since you're not using the captured group anyway, all you care is if it has an invalid character)...
And a nitpick: $.+^()?<>*{} don't need escaping at all inside of a character block. The only ones that do are your delimiter (/), - and a leading ^ character (which doesn't apply to you.
回答2:
You are matching too long text. It usually happen to me too when parsing very long subpatterns. Here are some things that you can try:
Remove the capturing parentheses:
$result = preg_match('/^[a-zA-Z0-9 \n\r,!@#\$\.\+\-%\^&\(\)~`\'":;_=\?\\/\|\<\>\*\{\}]+$/',$variable);
It might not work, as it still has to match very long text. Another way to do this is:
Do a negative match that matches only one character not in your set, and make sure that it does not match.
$result = preg_match('/[^a-zA-Z0-9 \n\r,!@#\$\.\+\-%\^&\(\)~`\'":;_=\?\\/\|\<\>\*\{\}]/',$variable);
$valid = !$result && strlen($variable) > 0;
P.S. Your code runs fine in my computer.
来源:https://stackoverflow.com/questions/5263555/preg-match-breaks-with-more-then-5100-characters