2012-12-19 74 views
-1

我工作的公司要求我給他們放置一個模式框在CMS的網頁上,但不想輸入HTML的能力。因爲我不能理解正則表達式,所以我無法得到它。preg_match(我不能做正則表達式)

它們應鍵入代碼的佈局是這樣的:

++modal++ 
Some paragraph text. 

Another paragraph. 
++endmodal++ 

段落已經由降價轉換爲<p>paragraph</p>

所以真的比賽必須++modal++ any number of A-Za-z0-9any symbol excluding + ++endmodal++然後用HTML取代。

我不確定它應該使用preg_match還是preg_replace

我能走到今天:

$string = '++modal++<p>Hello</p>++endmodal++'; 
$pattern = '/\+\+modal\+\+/'; 

preg_match($pattern, $string, $matches); 

預先感謝您。

編輯:A要更清楚一點,我希望用HTML取代++模式++和++ endmodal ++,並保持原樣。

回答

2

我真的不認爲你需要一個正則表達式這裏的分隔符保持不變,並總是在字符串相同的位置。正則表達式在資源上也很昂貴,作爲第三個反駁你說你不適合他們。
那麼,爲什麼不使用簡單的替換或字符串修剪,如果它涉及到。

$search = array('++modal++', '++endmodal++'); 
$replacement = array('<tag>', '</tag>'); 
$str = '++modal++<p>Hello</p>++endmodal++'; 

$result = str_replace($search, $replacement, $str); 

其中,當然,'<tag>''</tag>'是您的更換隻是例子佔位符。

這是什麼str_replace()手冊上說:

If you don't need fancy replacing rules (like regular expressions), 
you should always use this function instead of preg_replace(). 
+1

嗯,我沒有想到這一點。似乎更簡單。它奇妙地工作。謝謝你,先生。我現在感到很蠢。 –

+0

不用擔心,有時會過度冒險是正常的;-) – Havelock

1

我想你應該使用得到你想要的內容:

preg_match('/\+\+modal\+\+([^\+]+)\+\+endmodal\+\+/', $string, $matches) 

$matches[1] = '<p>Hello</p> 
1

你想在這裏重新發明輪子。您正在嘗試在這裏編寫一個簡單的模板系統,但是您可以使用幾十種用於PHP的模板工具,從大而複雜,如SmartyTwig到簡單的那些,並不比您嘗試的更多來寫。

我沒有使用它們,所以我不會推薦一個,我會指您a list of template engines you could try。你可能會發現更多的一點點谷歌搜索。

如果你堅持寫自己的話,考慮安全性是很重要的。如果您要輸出包含用戶輸入數據的任何內容,則必須確保所有輸出已正確轉義並消毒以便在網頁上顯示;有許多常見的黑客可以利用不安全的模板系統來完全危害網站。

+0

我正在使用CodeIgniter,它已經爲我輸入了所有這些東西。但是,這絕對是要記住的。我不想寫一個完整的模板系統,只是需要改變這個小東西。 我可能已經把它留在HTML中,並說很難,但我不認爲他們會太高興。 –

+0

我從來沒有理解爲什麼人們認爲'++ blah ++'比''更容易閱讀......但我自己也有過相同的對話。這似乎是一個相當普遍的觀點。 – SDC

1
<?php 
$string = '++modal++<p>Hello</p>++endmodal++'; 
$patterns = array(); 
$patterns[0] = "/\+\+modal\+\+/"; // put '\' just before + 
$patterns[1] = "/\+\+endmodal\+\+/"; 

$replacements = array(); 

$replacements[1] = '<html>'; 
$replacements[0] = '</html>'; 

echo preg_replace($patterns, $replacements, $string); 
?> 

非常相似,this example