PHP, RegEx and Objects

This is a discussion on PHP, RegEx and Objects within the PHP Language forums, part of the PHP Programming Forums category; Hi all I'd like to execute a piece of code when I find a particular string. So I used ...


Go Back   Usenet Forums > PHP Programming Forums > PHP Language

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 11-05-2003
Alexandre Lahure
 
Posts: n/a
Default PHP, RegEx and Objects

Hi all

I'd like to execute a piece of code when I find a particular string. So I
used preg_replace('/my_regex/e', 'my_piece_of_code', $my_string)

Actually, I'd like to convert something like this :
[img-32]
into something like that :
<img alt="" height="600" src="image.jpg" width="800" />

This wouldn't be very complicated if I hadn't to initialize an Image
object, then use a method called display(). My piece of code looks like
that :
$img = new Image(32); $img->display();

But instead of writing my tag (and displaying the image), PHP writes
'Object'
I'm looking for answers to this fundamental question : "Why ?" and of
course if somebody can solve my problem...

Thanks to all that are going to help me


--
Alexandre Lahure
Point 52, Solutions Internet "Ready to Start"
http://www.point52.com/

"Computers are like air conditioners,
They don't work when you open windows"
Reply With Quote
  #2 (permalink)  
Old 11-06-2003
Alvaro G Vicario
 
Posts: n/a
Default Re: PHP, RegEx and Objects

*** Alexandre Lahure wrote/escribió (Wed, 05 Nov 2003 20:06:26 +0100):
> $img = new Image(32); $img->display();
>
> But instead of writing my tag (and displaying the image), PHP writes
> 'Object'


<IMG> tag expects text (the name of the file). What does display() method
return?

--
--
-- Álvaro G. Vicario - Burgos, Spain
--
Reply With Quote
  #3 (permalink)  
Old 11-06-2003
Alexandre Lahure
 
Posts: n/a
Default Re: PHP, RegEx and Objects

> <IMG> tag expects text (the name of the file). What does display() method
> return?


I know that. Don't worry about what the display() method returns (but, if
you really want to know, it displays a fully functionnal <img> tag, with
all necessary attributes), it works just fine (actually, it was tested
under different conditions without problems).

The following piece of code works well in every case tested but the
preg_replace() case (and that's what gives me headache)
$img = new Image(32);
$img->display();

PHP seems to fail at Object initialization, or preg_replace() doesn't
consider Object initialization as valid PHP code (???)


--
Alexandre Lahure
Point 52, Solutions Internet "Ready to Start"
http://www.point52.com/

"Computers are like air conditioners,
They don't work when you open windows"
Reply With Quote
  #4 (permalink)  
Old 11-06-2003
Alvaro G Vicario
 
Posts: n/a
Default Re: PHP, RegEx and Objects

*** Alexandre Lahure wrote/escribió (Thu, 06 Nov 2003 14:04:56 +0100):
> The following piece of code works well in every case tested but the
> preg_replace() case (and that's what gives me headache)
> $img = new Image(32);
> $img->display();
>
> PHP seems to fail at Object initialization, or preg_replace() doesn't
> consider Object initialization as valid PHP code (???)


<?
class Image{
function display(){
return 'foo boo foo';
}
}
$img = new Image();
echo preg_replace('/boo/', 'this works for me', $img->display());
?>

--
--
-- Álvaro G. Vicario - Burgos, Spain
--
Reply With Quote
  #5 (permalink)  
Old 11-07-2003
Alexandre Lahure
 
Posts: n/a
Default Re: PHP, RegEx and Objects

> <?
> class Image{
> function display(){
> return 'foo boo foo';
> }
> }
> $img = new Image();
> echo preg_replace('/boo/', 'this works for me', $img->display());
> ?>


<?php
class Image {
function Image($image_id)
{
$this->image_id = $image_id;
$query = "SELECT width, height, src FROM images WHERE
img_id = '$this->image_id';";
$result = mysql_query($query);
if ($row = mysql_fetch_row($result)) {
$this->width = $row[0];
$this->height = $row[1];
$this->src = $row[2];
}
mysql_free_result($result);
}

function display() {
$image_tag = "<img src=\"$this->src\" width=\"$this->width\"
height=\"$this->height\" />";
return $image_tag;
}
}

$image_tag = preg_replace('/\[img-([0-9]+)\]/e', '\$img = new Image($1);
\$img->display();', '[img-32]');

print($image_tag); /* displays 'Object'
* instead of '<img src="image.jpg" width="800"
height="600" />' */


I simplified the code but this would be OK.

--
Alexandre Lahure
Point 52, Solutions Internet "Ready to Start"
http://www.point52.com/

"Computers are like air conditioners,
They don't work when you open windows"
Reply With Quote
  #6 (permalink)  
Old 11-07-2003
Alvaro G Vicario
 
Posts: n/a
Default Re: PHP, RegEx and Objects

*** Alexandre Lahure wrote/escribió (Fri, 07 Nov 2003 09:46:25 +0100):
> $image_tag = preg_replace('/\[img-([0-9]+)\]/e', '\$img = new Image($1);
> \$img->display();', '[img-32]');
>
> print($image_tag); /* displays 'Object'
> * instead of '<img src="image.jpg" width="800"
> height="600" />' */


The '=' operator has a return value: the value itself you're assigning. For
example:

$age=33; // returns 33
echo ($age=33) // prints 33

Since new Image() returns an object, you are inserting an object within a
string. PHP does its best to handle that: it makes a string representation
of the object: "Object".


--
--
-- Álvaro G. Vicario - Burgos, Spain
--
Reply With Quote
  #7 (permalink)  
Old 11-07-2003
Alexandre Lahure
 
Posts: n/a
Default Re: PHP, RegEx and Objects

> The '=' operator has a return value: the value itself you're assigning.
> For
> example:
>
> $age=33; // returns 33
> echo ($age=33) // prints 33
>
> Since new Image() returns an object, you are inserting an object within a
> string. PHP does its best to handle that: it makes a string
> representation
> of the object: "Object".


I agree, but if you look closer at the PHP manual, here what you will see
(PCRE / preg_replace section) :

"/e modifier makes preg_replace() treat the replacement parameter as PHP
code after the appropriate references substitution is done. Tip: make sure
that replacement constitutes a valid PHP code string, otherwise PHP will
complain about a parse error at the line containing preg_replace()."

As long as I know, my PHP code is valid since it works well when executed
separately. And admitting that PHP outputs 'Object', why does it not
output the second part of the code ?

--
Alexandre Lahure
Point 52, Solutions Internet "Ready to Start"
http://www.point52.com/

"Computers are like air conditioners,
They don't work when you open windows"
Reply With Quote
  #8 (permalink)  
Old 11-09-2003
Stefan Farnik
 
Posts: n/a
Default Re: PHP, RegEx and Objects

Alexandre Lahure <admin@point52.com> wrote in message news:<oprx9ennblyq0v8u@news.wanadoo.fr>...
> <?php
> class Image {
> function Image($image_id)
> {
> $this->image_id = $image_id;
> $query = "SELECT width, height, src FROM images WHERE
> img_id = '$this->image_id';";
> $result = mysql_query($query);
> if ($row = mysql_fetch_row($result)) {
> $this->width = $row[0];
> $this->height = $row[1];
> $this->src = $row[2];
> }
> mysql_free_result($result);
> }
>
> function display() {
> $image_tag = "<img src=\"$this->src\" width=\"$this->width\"
> height=\"$this->height\" />";
> return $image_tag;
> }
> }
>
> $image_tag = preg_replace('/\[img-([0-9]+)\]/e', '\$img = new Image($1);
> \$img->display();', '[img-32]');
>
> print($image_tag); /* displays 'Object'
> * instead of '<img src="image.jpg" width="800"
> height="600" />' */
>


try something like this:

<?php
class Image {
function Image($image_id)
{
$this->image_id = $image_id;
$query = "SELECT width, height, src FROM images
WHERE
img_id = '$this->image_id';";
$result = mysql_query($query);
if ($row = mysql_fetch_row($result)) {
$this->width = $row[0];
$this->height = $row[1];
$this->src = $row[2];
}
mysql_free_result($result);
}

function display($image_id = null)
{
if ($image_id !== null) {
$img = new Image($image_id);
return $img->display();
} else {
$image_tag = "<img src=\"$this->src\"
width=\"$this->width\" height=\"$this->height\" />";
return $image_tag;
}
}
}

$image_tag = preg_replace('/\[img-([0-9]+)\]/e',
'Image::display($1);', '[img-32]');

?>
Reply With Quote
  #9 (permalink)  
Old 11-10-2003
Alexandre Lahure
 
Posts: n/a
Default Re: PHP, RegEx and Objects

> try something like this:
>
> <?php
> class Image {
> function Image($image_id)
> {
> $this->image_id = $image_id;
> $query = "SELECT width, height, src FROM images
> WHERE
> img_id = '$this->image_id';";
> $result = mysql_query($query);
> if ($row = mysql_fetch_row($result)) {
> $this->width = $row[0];
> $this->height = $row[1];
> $this->src = $row[2];
> }
> mysql_free_result($result);
> }
>
> function display($image_id = null)
> {
> if ($image_id !== null) {
> $img = new Image($image_id);
> return $img->display();
> } else {
> $image_tag = "<img src=\"$this->src\"
> width=\"$this->width\" height=\"$this->height\" />";
> return $image_tag;
> }
> }
> }
>
> $image_tag = preg_replace('/\[img-([0-9]+)\]/e',
> 'Image::display($1);', '[img-32]');
>
> ?>


Yes, it works, thank you, but I can't stop thinking it's cheating. I'm
sure there is a way to do this "fairly", or the PHP manual is lying about
the power of the 'e' modifier of preg_replace().

One day, truth will be mine...


--
Alexandre Lahure
Point 52, Solutions Internet "Ready to Start"
http://www.point52.com/

"Computers are like air conditioners,
They don't work when you open windows"
Reply With Quote
  #10 (permalink)  
Old 11-11-2003
Alvaro G Vicario
 
Posts: n/a
Default Re: PHP, RegEx and Objects

*** Alexandre Lahure wrote/escribió (Fri, 07 Nov 2003 13:54:47 +0100):
> "/e modifier makes preg_replace() treat the replacement parameter as PHP
> code after the appropriate references substitution is done. Tip: make sure
> that replacement constitutes a valid PHP code string, otherwise PHP will
> complain about a parse error at the line containing preg_replace()."


I've been playing around with my code:

<pre><?
class Image{
function display(){
return '[Here goes image tag]';
}
}
$img1=new Image();
echo preg_replace('/i/', $img1->display(), "This is a test\n");
echo preg_replace('/i/e', '$img1->display()', "This is a test\n");
echo preg_replace('/i/e', '$img2=new Image(); $img2->display();',
"This is a test\n")
?>

This prints:

Th[Here goes image tag]s [Here goes image tag]s a test
Th[Here goes image tag]s [Here goes image tag]s a test
ThObjects Objects a test


Could it be a variable scope issue?

--
--
-- Álvaro G. Vicario - Burgos, Spain
--
Reply With Quote
Reply
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On




All times are GMT +1. The time now is 06:53 AM.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.0.0