Hi -
I'd like to ask that the pcre_match*() functions be modified such that
they can also return position info on where the match(s) occured, akin to
Perl's pos(). I think this would be a very useful addition, plus it
requires minimal code changes since the actual function, php_pcre_match()
computes the values presently but just throws them away.
I've modified my own build to do this, and I've attached a diff...but I'd
regard this as proof-of-concept code since I did it in a hurry (so maybe
it can make 4.2.0?) and I haven't coded in C since my university classes
couple years back. It's actually kinda of embarassing, but heck I don't
know any of you. =P.
The only really difficulty would be deciding how to return the
values...I've thought up a bunch of ways of implementing this
other than the stupidly simple add another nested array I did, like use a
resource, a new function, return a 2nd array, etc.
--Ricky
326d324
<
328c326
< zval **position; /* Option to return match positions */
---
>
342d339
< int position_val = 0; /* Integer value of
position_flag */
369,387c366
< /* Make sure subpats_order*/
< convert_to_long_ex(subpats_order);
<
< subpats_order_val = Z_LVAL_PP(subpats_order);
<
< if (subpats_order_val < PREG_PATTERN_ORDER ||
< subpats_order_val > PREG_SET_ORDER) {
< zend_error(E_WARNING, "Wrong value for parameter 4 in
call to preg_match_all()");
< }
<
<
< break;
< case 5:
< if (zend_get_parameters_ex(5, ®ex, &subject, &subpats,
&subpats_order, &position) == FAILURE) {
< WRONG_PARAM_COUNT;
< }
<
<
< /* Make sure subpats_order/ position flag is a number */
---
> /* Make sure subpats_order is a number */
389,390d367
< convert_to_long_ex(position);
<
392,393d368
< position_val = Z_LVAL_PP(position);
<
429d403
< if (position_val) {
431d404
< }
439d411
< if (position_val) {
443d414
< }
482a456,459
> /* add position information */
>
>
>
487,491c464
<
< /* add position information */
<
< if (position_val) {
< pos = (char
*)emalloc(16 * sizeof(char));
---
> pos = (char *)emalloc(5 *
>sizeof(char));
499,500d471
< }
<
525,526d495
<
< if (position_val) {
531c500
< pos = (char *)emalloc(16 *
sizeof(char));
---
> pos = (char *)emalloc(5 *
>sizeof(char));
542d510
<
zend_hash_next_index_insert(Z_ARRVAL_P(result_set), &match_sets_pos[0], sizeof(zval
*), NULL);
545c513
< }
---
>
>zend_hash_next_index_insert(Z_ARRVAL_P(result_set), &match_sets_pos[0], sizeof(zval
>*), NULL);
590d557
< if(position_val) {
592d558
< }
596d561
< if (position_val) {
598,600d562
< efree(pos);
< }
<
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php