johannes Tue Aug 9 16:49:19 2005 EDT
Added files:
/php-src/ext/standard/tests/strings stristr.phpt
Modified files:
/php-src NEWS
/php-src/ext/standard string.c
/php-src/ext/standard/tests/strings strstr.phpt
Log:
- Added option to strstr() and stristr() to get a particular haystack
component
http://cvs.php.net/diff.php/php-src/NEWS?r1=1.2030&r2=1.2031&ty=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2030 php-src/NEWS:1.2031
--- php-src/NEWS:1.2030 Tue Aug 9 11:07:18 2005
+++ php-src/NEWS Tue Aug 9 16:49:12 2005
@@ -6,6 +6,8 @@
. Added CURLINFO_HEADER_OUT to facilitate request retrieval.
- Added an optional parameter to parse_url() to allow retrieval of
distinct URL
components. (Ilia)
+- Added an optional parameter to strstr() and stristr() for retrieval of
either
+ the part of haystack before or after first occurence of needle. (Johannes)
?? ??? 2005, PHP 5.1
- Upgraded PCRE library to version 6.2. (Andrei)
http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.445&r2=1.446&ty=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.445
php-src/ext/standard/string.c:1.446
--- php-src/ext/standard/string.c:1.445 Wed Aug 3 10:08:13 2005
+++ php-src/ext/standard/string.c Tue Aug 9 16:49:18 2005
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.445 2005/08/03 14:08:13 sniper Exp $ */
+/* $Id: string.c,v 1.446 2005/08/09 20:49:18 johannes Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -1433,52 +1433,60 @@
}
/* }}} */
-/* {{{ proto string stristr(string haystack, string needle)
+/* {{{ proto string stristr(string haystack, string needle[, bool part])
Finds first occurrence of a string within another, case insensitive */
PHP_FUNCTION(stristr)
{
- zval **haystack, **needle;
+ char *haystack;
+ long haystack_len;
+ zval *needle;
+ zend_bool part = 0;
char *found = NULL;
int found_offset;
char *haystack_orig;
char needle_char[2];
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &haystack,
&needle) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b",
&haystack, &haystack_len, &needle, &part) == FAILURE) {
+ return;
}
- SEPARATE_ZVAL(haystack);
- SEPARATE_ZVAL(needle);
-
- convert_to_string_ex(haystack);
+ SEPARATE_ZVAL(&needle);
- haystack_orig = estrndup(Z_STRVAL_PP(haystack),
Z_STRLEN_PP(haystack));
+ haystack_orig = estrndup(haystack, haystack_len);
- if (Z_TYPE_PP(needle) == IS_STRING) {
- if (!Z_STRLEN_PP(needle)) {
+ if (Z_TYPE_P(needle) == IS_STRING) {
+ if (!Z_STRLEN_P(needle)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Empty delimiter.");
efree(haystack_orig);
RETURN_FALSE;
}
- found = php_stristr(Z_STRVAL_PP(haystack),
- Z_STRVAL_PP(needle),
- Z_STRLEN_PP(haystack),
- Z_STRLEN_PP(needle));
+ found = php_stristr(haystack,
+ Z_STRVAL_P(needle),
+ haystack_len,
+ Z_STRLEN_P(needle));
} else {
- convert_to_long_ex(needle);
- needle_char[0] = (char) Z_LVAL_PP(needle);
+ convert_to_long_ex(&needle);
+ needle_char[0] = (char) Z_LVAL_P(needle);
needle_char[1] = 0;
- found = php_stristr(Z_STRVAL_PP(haystack),
+ found = php_stristr(haystack,
needle_char,
- Z_STRLEN_PP(haystack),
+ haystack_len,
1);
}
if (found) {
- found_offset = found - Z_STRVAL_PP(haystack);
- RETVAL_STRINGL(haystack_orig + found_offset,
Z_STRLEN_PP(haystack) - found_offset, 1);
+ found_offset = found - haystack;
+ if (part) {
+ char *ret;
+ ret = emalloc(found_offset + 1);
+ strncpy(ret, haystack_orig, found_offset);
+ ret[found_offset] = '\0';
+ RETVAL_STRINGL(ret , found_offset, 0);
+ } else {
+ RETVAL_STRINGL(haystack_orig + found_offset,
haystack_len - found_offset, 1);
+ }
} else {
RETVAL_FALSE;
}
@@ -1487,45 +1495,54 @@
}
/* }}} */
-/* {{{ proto string strstr(string haystack, string needle)
+/* {{{ proto string strstr(string haystack, string needle[, bool part])
Finds first occurrence of a string within another */
PHP_FUNCTION(strstr)
{
- zval **haystack, **needle;
+ char *haystack;
+ long haystack_len;
+ zval *needle;
+ zend_bool part = 0;
char *found = NULL;
char needle_char[2];
long found_offset;
-
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &haystack,
&needle) == FAILURE) {
- WRONG_PARAM_COUNT;
- }
- convert_to_string_ex(haystack);
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|b",
&haystack, &haystack_len, &needle, &part) == FAILURE) {
+ return;
+ }
- if (Z_TYPE_PP(needle) == IS_STRING) {
- if (!Z_STRLEN_PP(needle)) {
+ if (Z_TYPE_P(needle) == IS_STRING) {
+ if (!Z_STRLEN_P(needle)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Empty delimiter.");
RETURN_FALSE;
}
- found = php_memnstr(Z_STRVAL_PP(haystack),
- Z_STRVAL_PP(needle),
- Z_STRLEN_PP(needle),
- Z_STRVAL_PP(haystack) +
Z_STRLEN_PP(haystack));
+ found = php_memnstr(haystack,
+ Z_STRVAL_P(needle),
+ Z_STRLEN_P(needle),
+ haystack + haystack_len);
} else {
- convert_to_long_ex(needle);
- needle_char[0] = (char) Z_LVAL_PP(needle);
+ convert_to_long_ex(&needle);
+ needle_char[0] = (char) Z_LVAL_P(needle);
needle_char[1] = 0;
- found = php_memnstr(Z_STRVAL_PP(haystack),
+ found = php_memnstr(haystack,
needle_char,
1,
- Z_STRVAL_PP(haystack) +
Z_STRLEN_PP(haystack));
+ haystack + haystack_len);
}
if (found) {
- found_offset = found - Z_STRVAL_PP(haystack);
- RETURN_STRINGL(found, Z_STRLEN_PP(haystack) -
found_offset, 1);
+ found_offset = found - haystack;
+ if (part) {
+ char *ret;
+ ret = emalloc(found_offset + 1);
+ strncpy(ret, haystack, found_offset);
+ ret[found_offset] = '\0';
+ RETURN_STRINGL(ret , found_offset, 0);
+ } else {
+ RETURN_STRINGL(found, haystack_len - found_offset, 1);
+ }
} else {
RETURN_FALSE;
}
http://cvs.php.net/diff.php/php-src/ext/standard/tests/strings/strstr.phpt?r1=1.2&r2=1.3&ty=u
Index: php-src/ext/standard/tests/strings/strstr.phpt
diff -u php-src/ext/standard/tests/strings/strstr.phpt:1.2
php-src/ext/standard/tests/strings/strstr.phpt:1.3
--- php-src/ext/standard/tests/strings/strstr.phpt:1.2 Wed May 19
04:45:23 2004
+++ php-src/ext/standard/tests/strings/strstr.phpt Tue Aug 9
16:49:19 2005
@@ -14,6 +14,8 @@
var_dump(@strstr("a", ""));
var_dump(@strstr("", "a"));
var_dump(md5(@strstr("\\\\a\\", "\\a")));
+ var_dump(strstr("test string", " ", false));
+ var_dump(strstr("test string", " ", true));
?>
--EXPECT--
string(11) "test string"
@@ -28,3 +30,5 @@
bool(false)
bool(false)
string(32) "6ec19f52f0766c463f3bb240f4396913"
+string(7) " string"
+string(4) "test"
http://cvs.php.net/co.php/php-src/ext/standard/tests/strings/stristr.phpt?r=1.1&p=1
Index: php-src/ext/standard/tests/strings/stristr.phpt
+++ php-src/ext/standard/tests/strings/stristr.phpt
--TEST--
stristr() function
--FILE--
<?php
var_dump(stristr("tEsT sTrInG", "tEsT"));
var_dump(stristr("tEsT sTrInG", "stRiNg"));
var_dump(stristr("tEsT sTrInG", "stRiN"));
var_dump(stristr("tEsT sTrInG", "t S"));
var_dump(stristr("tEsT sTrInG", "g"));
var_dump(md5(stristr("te".chr(0)."st", chr(0))));
var_dump(@stristr("", ""));
var_dump(@stristr("a", ""));
var_dump(@stristr("", "a"));
var_dump(md5(@stristr("\\\\a\\", "\\a")));
var_dump(stristr("tEsT sTrInG", " ", false));
var_dump(stristr("tEsT sTrInG", " ", true));
?>
--EXPECT--
string(11) "tEsT sTrInG"
string(6) "sTrInG"
string(6) "sTrInG"
string(8) "T sTrInG"
string(1) "G"
string(32) "7272696018bdeb2c9a3f8d01fc2a9273"
bool(false)
bool(false)
bool(false)
string(32) "6ec19f52f0766c463f3bb240f4396913"
string(7) " sTrInG"
string(4) "tEsT"
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php