Browse Source

Fixed bug #35427 (str_word_count() handles '-' incorrectly).

PHP-5.1
Ilia Alshanetsky 21 years ago
parent
commit
0242b892d2
  1. 1
      NEWS
  2. 31
      ext/standard/string.c
  3. 30
      ext/standard/tests/strings/str_word_count.phpt

1
NEWS

@ -13,6 +13,7 @@ PHP NEWS
- Fixed bug #35456 (+ 1 [time unit] format did not work). (Ilia)
- Fixed bug #35431 (PDO crashes when using LAZY fetch with fetchAll). (Wez)
- Fixed bug #35430 (PDO crashes on incorrect FETCH_FUNC use). (Tony)
- Fixed bug #35427 (str_word_count() handles '-' incorrectly). (Ilia)
- Fixed bug #35422 (strtotime() does not parse times with UTC as timezone).
(Ilia)
- Fixed bug #35414 (strtotime() no longer works with ordinal suffix). (Ilia)

31
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) {

30
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"
}
}
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-"
}
Loading…
Cancel
Save