diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2005-11-29 16:14:19 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2005-11-29 16:14:19 +0000 |
commit | 0242b892d2afdcd30ee22f3dcf13ec4cfa5b03e0 (patch) | |
tree | 17d61fc12b459c82099bb454cbf7321787059fef /ext | |
parent | d61e8d63fd432f71ebf0edefcfeac34654456a0f (diff) | |
download | php-git-0242b892d2afdcd30ee22f3dcf13ec4cfa5b03e0.tar.gz |
Fixed bug #35427 (str_word_count() handles '-' incorrectly).
Diffstat (limited to 'ext')
-rw-r--r-- | ext/standard/string.c | 31 | ||||
-rw-r--r-- | ext/standard/tests/strings/str_word_count.phpt | 30 |
2 files changed, 46 insertions, 15 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c index 9ab31ba57f..d7913c49ce 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -4735,33 +4735,38 @@ PHP_FUNCTION(str_word_count) if (type == 1 || type == 2) { array_init(return_value); } - + + /* first character cannot be ' or -, unless explicitly allowed by the user */ + if ((*p == '\'' && (!char_list || !ch['\''])) || (*p == '-' && (!char_list || !ch['-']))) { + p++; + } + /* last character cannot be -, unless explicitly allowed by the user */ + if (*(e - 1) == '-' && (!char_list || !ch['-'])) { + e--; + } + while (p < e) { - if (isalpha(*p) || (char_list && ch[(unsigned char)*p])) { - s = ++p - 1; - while (isalpha(*p) || *p == '\'' || (*p == '-' && isalpha(*(p+1))) || (char_list && ch[(unsigned char)*p])) { - p++; - } - + s = p; + while (p < e && (isalpha(*p) || (char_list && ch[(unsigned char)*p]) || *p == '\'' || *p == '-')) { + p++; + } + if (p > s) { switch (type) { case 1: buf = estrndup(s, (p-s)); - add_next_index_stringl(return_value, buf, (p-s), 1); - efree(buf); + add_next_index_stringl(return_value, buf, (p-s), 0); break; case 2: buf = estrndup(s, (p-s)); - add_index_stringl(return_value, (s - str), buf, p-s, 1); - efree(buf); + add_index_stringl(return_value, (s - str), buf, p-s, 0); break; default: word_count++; break; } - } else { - p++; } + p++; } if (!type) { diff --git a/ext/standard/tests/strings/str_word_count.phpt b/ext/standard/tests/strings/str_word_count.phpt index 0c6c5ae566..9d41fc147b 100644 --- a/ext/standard/tests/strings/str_word_count.phpt +++ b/ext/standard/tests/strings/str_word_count.phpt @@ -36,7 +36,11 @@ var_dump(str_word_count($str2, 2, "014")); var_dump(str_word_count($str2, 2, array())); var_dump(str_word_count($str2, 2, new stdClass)); var_dump(str_word_count($str2, 2, "")); - +var_dump(str_word_count("foo'0 bar-0var", 2, "0")); +var_dump(str_word_count("'foo'", 2)); +var_dump(str_word_count("'foo'", 2, "'")); +var_dump(str_word_count("-foo-", 2)); +var_dump(str_word_count("-foo-", 2, "-")); ?> --EXPECTF-- array(6) { @@ -225,4 +229,26 @@ array(7) { string(3) "bar" [15]=> string(3) "foo" -}
\ No newline at end of file +} +array(2) { + [0]=> + string(5) "foo'0" + [6]=> + string(8) "bar-0var" +} +array(1) { + [1]=> + string(4) "foo'" +} +array(1) { + [0]=> + string(5) "'foo'" +} +array(1) { + [1]=> + string(3) "foo" +} +array(1) { + [0]=> + string(5) "-foo-" +} |