2013-01-21 59 views
0

在下面的xml中,我必須追加所有位於展示標記下的url。php追加xml子串

<Ad id="32716">   
<InLine>    
    <AdSystem>BrightRoll</AdSystem>   
    <AdTitle/>   
    <Impression><![CDATA[http://2901.btrll.com/imp/2901/12446/PreRoll.911.123806/start;Video;1358769313]]> 
    </Impression>   
    <Impression><![CDATA[http://brxserv.btrll.com/v1/epix/6835361/3850628/20799/32716/TbwKgCbwBkAABQ_SyhAABRPwAAf8wAOsGEAAAAAAAfYQiqTYrVDQ/event.imp/r_64.aHR0cDovL2Iuc2NvcmVjYXJkcmVzZWFyY2guY29tL3A_YzE9MSZjMj02MDAwMDA2JmMzPSZjND1icngmYzU9MDEwMDAwJmM2PTY4MzUzNjEmYzEwPSZjQTE9OCZjQTI9NjAwMDAwNiZjQTM9MjA3OTkmY0E0PTM4NTA2MjgmY0E1PTQ3NDcmY0E2PTY4MzUzNjEmY0ExMD0zMjcxNiZjdj0xLjcmY2o9JnJuPTEzNTg3NjkzMTMmcj1odHRwJTNBJTJGJTJGcGl4ZWwucXVhbnRzZXJ2ZS5jb20lMkZwaXhlbCUyRnAtY2I2QzB6RkY3ZFdqSS5naWYlM0ZsYWJlbHMlM0RwLjY4MzUzNjEuMzg1MDYyOC4wJTJDYS40NzQ3LjIwNzk5LjMyNzE2JTJDdS45NjguMHgwJTNCbWVkaWElM0RhZCUzQnIlM0QxMzU4NzY5MzEz]]> 
    </Impression>   
    <Impression><![CDATA[http://ib.adnxs.com/seg?add=362896&t=2&cb=1358769313]]> 
    </Impression>   
    <Impression><![CDATA[http://rc.rlcdn.com/361686.gif]]> 
    </Impression>   
    <Impression><![CDATA[http://mobile.btrll.com/event/impression?ts=1358769313920&siteId=3850628&lineItemId=20799]]> 
    </Impression>   
    <Creatives>    
     <Creative sequence="1">     
      <Linear>       
       <Duration>00:00:14</Duration>      
       <TrackingEvents>        
        <Tracking event="midpoint"><![CDATA[http://brxserv.btrll.com/v1/epix/6835361/3850628/20799/32716/TbwKgCbwBkAABQ_SyhAABRPwAAf8wAOsGEAAAAAAAfYQiqTYrVDQ/event.mid/r_64.aHR0cDovLzI5MDEuYnRybGwuY29tL2ltcC8yOTAxLzEyNDQ2L1ByZVJvbGwuOTExLjEyMzgwNi9taWQ7VmlkZW87MTM1ODc2OTMxMw]]> 
        </Tracking>       
        <Tracking event="complete"><![CDATA[http://brxserv.btrll.com/v1/epix/6835361/3850628/20799/32716/TbwKgCbwBkAABQ_SyhAABRPwAAf8wAOsGEAAAAAAAfYQiqTYrVDQ/event.end/r_64.aHR0cDovLzI5MDEuYnRybGwuY29tL2ltcC8yOTAxLzEyNDQ2L1ByZVJvbGwuOTExLjEyMzgwNi9kb25lO1ZpZGVvOzEzNTg3NjkzMTM]]> 
        </Tracking>       
        <Tracking event="complete"><![CDATA[http://mobile.btrll.com/event/completion?ts=1358769313921&siteId=3850628&lineItemId=20799]]> 
        </Tracking>      
       </TrackingEvents>      
       <VideoClicks>       
        <ClickThrough><![CDATA[http://brxserv.btrll.com/v1/epix/6835361/3850628/20799/32716/TbwKgCbwBkAABQ_SyhAABRPwAAf8wAOsGEAAAAAAAfYQiqTYrVDQ/event.click/r_64.aHR0cDovLzI5MDEuYnRybGwuY29tL2Nsay8yOTAxLzEyNDQ2L1ByZVJvbGwuOTExLjEyMzgwNi9ub25lLztWaWRlbzsxMzU4NzY5MzEz]]> 
        </ClickThrough>       
        <ClickTracking><![CDATA[http://brxserv.btrll.com/v1/epix/6835361/3850628/20799/32716/TbwKgCbwBkAABQ_SyhAABRPwAAf8wAOsGEAAAAAAAfYQiqTYrVDQ/event.c_trk/r_64.aHR0cDovLzI5MDEuYnRybGwuY29tL2Nsay8yOTAxLzEyNDQ2L1ByZVJvbGwuOTExLjEyMzkyNy9ub25lLztWaWRlbzsxMzU4NzY5MzEz]]> 
        </ClickTracking>        
        <ClickTracking><![CDATA[http://mobile.btrll.com/event/click?ts=1358769313921&siteId=3850628&lineItemId=20799]]> 
        </ClickTracking>       
       </VideoClicks>      
       <MediaFiles>        
        <MediaFile delivery="progressive" type="video/mp4" bitrate="400" height="240" width="320"><![CDATA[http://brxcdn2.btrll.com/production/134980/Home_Depot_MuddyBoots_640x480_15sec.mp4]]> 
        </MediaFile>       
       </MediaFiles>     
      </Linear>     
     </Creative>    
     <Creative sequence="1">     
      <CompanionAds>     </CompanionAds>    
     </Creative>   
    </Creatives>   
</InLine> 

在現有<Impression></Impression>之間的內容,希望增加更多的字符串。

我該如何做到這一點?

我試圖像這樣

$pattern = '<Impression>.*?</Impression>';  
preg_match($pattern, $jsaved, $matchesarr); 
+1

不要對此任務使用正則表達式。看到這個問題更好的解析XML/HTML的方法:http://stackoverflow.com/questions/3577641/how-to-parse-and-process-html-xml-with-php/3577662#3577662 – 2013-01-21 12:52:40

回答

1

東西在大多數情況下*,你不應該使用正則表達式解析HTML或XML。它並不是這項工作的正確工具,而且很可能令人沮喪且容易出錯。 See this question for better ways of doing this in PHP

這就是說,您的正則表達式失敗,因爲默認情況下,.與換行符不匹配。這意味着只有匹配<Impression>...</Impression>,如果全部出現在單行上。

爲了解決這個問題,你必須添加多行開關(m):

$pattern = '|<Impression>.*?</Impression>|m';

**也有例外。正則表達式可以很好,如果你的輸入是非常明確的,並且始終遵循可預測的格式。但是,絕對值得考慮XML解析器是否會更好。*

+0

此外,你應該'使用'。*?'而是'。*' - ?意味着「前一次,零次或一次」,*表示「之前的任意次數(包括零)」,所以?是多餘的。 – Magnus

+0

@Magnus,這是不正確的。 '?'是必須的,這樣每個開始標籤都與第一個後續結束標籤匹配。如果將其刪除,則會從第一個開始標記到最終結束標記之間獲得一個巨大的匹配。 – 2013-01-21 13:03:00

+0

啊對,我一直忘記Perl和PHP regexen實際上不是* regular *。 *嘆*,對不起我的壞。 – Magnus