2014-06-25 73 views
1

我正在使用JotCache作爲緩存組件的joomla網站。 要直接從緩存中一些模塊排除在模板文件,該組件使用自己的「標誌」,如:preg_replace刪除僅關閉標記

<jot myposition s> Module Position <jot myposition e> 

現在,我嘗試使用DOM文檔,以壓縮HTML槽PHP的,但結果是這和緩存組件不起作用:

<jot myposition s> Module Position <jot myposition e></jot></jot> 

我打算使用preg_replace去掉</jot>結束標記。 我試過這個正則表達式"/<[\/]*jot[^>]*>/i",但它剝去了所有<jot>標籤,包括所需的<jot myposition s><jot myposition e>

因爲我不確定如何用DOMDocument完成此操作(防止標籤自動關閉),我怎麼用preg_replace來做到這一點?

任何想法將不勝感激。

謝謝。

+0

您的預期產出是? –

+0

模塊位置 DavidF

+0

要刪除'',您可以簡單地使用這個'/ <\/jot>/i' –

回答

2

探索一些正則表達式的好機會!

關於使用正則表達式處理xml類型文檔的所有免責聲明......有幾個有趣的選項可用於這樣的任務。

選項1:普通但可靠

$replaced = preg_replace('%(<jot.*?</jot>)</jot>%', '$1', $yourstring); 
  • 這裏,爲了安全,我們的整個字符串包括兩個</jot>末相匹配。
  • .*?「懶點星」數量,確保我們不會意外地跑過去的第一關閉</jot>
  • 括號捕捉你想組1
  • 我們更換組1
字符串

選項2:更多 「魯莽」

$replaced = preg_replace('%</jot></jot>%', '</jot>', $yourstring); 
  • 在這裏,我們只是配合</jot></jot>
  • 我們與</jot>

選項3替換:未來派

$replaced = preg_replace('%</jot>(?=</jot>)%', '', $yourstring); 
  • 在這裏,我們匹配</jot>,然後先行(?=</jot>)斷言</jot>可再次發現,但不符合它。
  • 我們用一個空字符串

選項4取代:禁止入內!

$replaced = preg_replace('%<jot.*?</jot>\K</jot>%', '', $yourstring); 
  • 作爲第一選項,<jot.*?</jot>整個標籤匹配...
  • 然後\K告訴引擎放下手頭迄今匹配!
  • </jot>匹配第二</jot>
  • 我們與空字符串
0

下面的正則表達式後</符號和更換部件將捕獲所有的字符替換,它與空字符串替換匹配的字符。

<\/.*$ 

說明:

  • <匹配文字<符號。
  • \/匹配斜線/
  • .*$匹配高達最後的所有字符。

DEMO

你的PHP代碼會是這樣,

<?php 
$re = '~<\/.*$~'; 
$str= '<jot myposition s> Module Position <jot myposition e></jot></jot>'; 
$replacement = ""; 
echo preg_replace($re, "", $str); 
?> //=> <jot myposition s> Module Position <jot myposition e> 
0

如果你只是去你爲什麼不使用使用str_replace一個簡單的方法來剝離</jot>,?

$output = '<jot myposition s> Module Position <jot myposition e></jot></jot>'; 
$output = str_replace('</jot>', '', $output); 

documentation

如果你不需要花哨更換的規則(比如正則表達式),你應該始終使用此功能,而不是preg_replace函數()。