Re: Regular Expression Backreference in subpattern.
| From: | Nathan Rixham | Date: | Sat, 27 Sep 2008 19:49:42 +0000 |
| Subject: | Re: Regular Expression Backreference in subpattern. | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-281054@lists.php.net to get a copy of this message | ||
Shiplu wrote:
The string is "<td>charge</td><td>100</td>". I want and array( "charge"=>100). I am using this regular expression, '/<td>([^<]+)<\/td><td>(?P<\1>\d+)<\/td>/'. But its not working.. I get this error., PHP Warning: preg_match(): Compilation failed: syntax error after (?P at offset 25 in E:\src\php\WebEngine\- on line 4 any idea?it seem's everybody is giving you the same answers; here's a definitive look at the problem (as far as I'm aware) all preg_* functions can only return back string's, or array's of strings; there is no method of returning back an associative array as you would like; the closest you can get is by using preg_replace or preg_replace_callback as follows: print_r( preg_replace_callback('|<td>(.*)</td><td>(\d+)</td>|', create_function(
'$matches',
'return array($matches[0],$matches[1]);'
), $string) );
this will fall as the internals of preg* casts the array to a string
alternative:
print_r( preg_replace('|<td>(.*)</td><td>(\d+)</td>|e', 'array("$1","$2")', $string) );
this will also fail as the internals of preg* casts the array to a string.
similarly all other options you could go down such as simple explodes, strip_tags or even more complex stream filters will only allow you to return strings, or numerical array's of strings.
This leaves you high and dry I'm afraid - the only thing for it is to create a simple function to handle this for you; something like
function td_thing( $string ) {
$a = preg_replace('|<td>(.*)</td><td>(\d+)</td>|e', '$1 $2', $string);
$b = explode(' ', $a);
return array("$b[0]" => "$b[1]);
}
maybe just maybe you or I or somebody else can find a way to do this easily in one line; but for now a function similar to above is the best you can do..
Regards
Nathan