homepage Welcome to WebmasterWorld Guest from 54.196.62.23
register, free tools, login, search, pro membership, help, library, announcements, recent posts, open posts,
Become a Pro Member
Home / Forums Index / Code, Content, and Presentation / PHP Server Side Scripting
Forum Library, Charter, Moderators: coopster & jatar k

PHP Server Side Scripting Forum

    
Php regular expression braincracker
wapsi

5+ Year Member



 
Msg#: 3732762 posted 8:58 pm on Aug 27, 2008 (gmt 0)

Hi all,

I wrote a abstract layer for my database objects but recently I bumped into a problem which I'm not able to solve up till now.
I'm not searching for an easy solution here, but maybe someone can point me in the right direction.
For parsing of template generated content I need some expressions but I can't formulate them correctly.
Basically, what I want to do is to fetch certain variables from html code and replace them by values stored in the database. I seems easy but the expression for it is much more tricky than one would think.

Suppose you have the following html string :

$html = '<datagrid name="Author">'.
'<h1>'.
'<field name="FirstName"/>'.
'<field name="LastName"/></h1><br />'.
'<one-to-many name="Book">'.
'Books written : <br />'.
'Title : <field name="Title"/><br />'.
'Type : <field name="Type"/><br />'.
'Details : <br />'.
'<one-to-many name="Page">'.
'Page <field name="Number"/> : <br />'.
'Content <field name="Content"/>'.
'</one-to-many>'.
'</one-to-many>'.
'<hr><br />'.
'<datagrid name="MusicSongs">'.
'<field name="Title"/> - <field name="Album"/>'.
'<br />'.
'</datagrid>'.
'<p>Author birthdate : <field name="BirthDate"/></p>'.
'</datagrid>';

I need to fetch all datagrid, field and one-to-many tags, including their attributes, parse them to a php DAO object and send it to my backend server. The Dao object looks like this :

class DaoType extends Object {

var $className;
var $fields = array();
var $oneToMany = array();

function __construct(){}

function getClassName(){
return $this->className;
}

function setClassName($className){
$this->className = $className;
}

function getFields(){
return $this->fields;
}

function setFields($fields){
$this->fields= $fields;
}

function getOneToMany(){
return $this->oneToMany;
}

function setOneToMany($oneToMany){
$this->oneToMany = $oneToMany;
}
}

Please note the following issues :

  1. datagrid is the super tag. All field and one-to-many tags must be inside a datagrid tag. A field tag however can be inside a one-to-many tag. A one-to-many tag can be nested in another one-to-many.
  2. All field and one-to-many tags should register inside their first parent tag DAO object. (datagrid or one-to-many)
  3. A field tag is a closed tag. Is may not contain any content and must be closed immediately. datagrid and one-to-many tags must contain at least one field or one-to-many tag.
  4. datagrid tags can be nested. In this case, we should parse a DAO object for each datagrid tag. Also note that content of the inner datagrid shouldn't be added to the outer datagrid DAO object.
  5. There's no predefined sequence for field and one-to-many tags. Fe the field author->birthdate comes after the one-to-many book tag. It should be registered however as a field in the upper Author DAO.
  6. one-to-many tags can be nested unlimited
  7. There's absolutely no relationship between different datagrids although they can be nested.

For example, the html string above should result in two DaoType objects:

The inner datagrid MusicSongs is a DAO with following properties :

$className = MusicSongs
$fields = array("Title", "Album")
$oneToMany = array()

The outer datagrid Author is a DAO with following properties :

$className = Author
$fields = array("FirstName", "LastName", "BirthDate")
$oneToMany = array($BookDaoObject)

The BookDaoObject above is again a DAO object with following properties :

$className = Book
$fields = array("Title", "Type")
$oneToMany = array($PageDaoObject)

The PageDaoObjectabove is again a DAO object with following properties :

$className = Page
$fields = array("Number", "Content")
$oneToMany = array()

So what I need is a preg_match expression to fetch all datagrids from inside to outer and separate their content (= html + fields + onetomany tags).
Once the datagrids are separated, we need to do search for all fields and onetomany (nested!). onetomany must be registered as a new DAO object inside it's parent container so we obtain the object structure as above.

I know one can do neat and powerfull stuff with these regular expressions, and it must be possible. Unfortunately, I'm not an expert in this area. It caused already several serious headaches, but I can't manage to solve this one. Maybe somebody has any suggestions? Maybe a different approach will bring light in the dark for me.

Anyhow, any help will be highly appreciated.

Kind regards,

wapsi

 

adb64

10+ Year Member



 
Msg#: 3732762 posted 9:33 pm on Aug 27, 2008 (gmt 0)

You may want to take a look at PHPs XML Parser [php.net] functions. I've never used them, but I think you could use them for your application.

Global Options:
 top home search open messages active posts  
 

Home / Forums Index / Code, Content, and Presentation / PHP Server Side Scripting
rss feed

All trademarks and copyrights held by respective owners. Member comments are owned by the poster.
Home ¦ Free Tools ¦ Terms of Service ¦ Privacy Policy ¦ Report Problem ¦ About ¦ Library ¦ Newsletter
WebmasterWorld is a Developer Shed Community owned by Jim Boykin.
© Webmaster World 1996-2014 all rights reserved