2014-10-05 49 views
2

我想獲得一個正則表達式模式來實現Joomla CMS,使用插件,類似於WordPress的短代碼功能。正則表達式匹配wordpress像短代碼,爲自我關閉和封閉

的簡碼可以是自閉合一個像{myshortcode shortcode="codeone"}在一些occassions並且可以是一個封閉的像:

{myshortcode shortcode="anothercode"|param="test"} 
{column}column 1{/column} 
{/myshortcode} 

我設法弄清楚在WordPress中使用的正則表達式:

{(}?)(myshortcode)(?![\w-])([^}\/]*(?:\/(?!})[^}\/]*)*?)(?:(\/)}|}(?:([^{]*+(?:{(?!\/\2})[^{]*+)*+){\/\2})?)(}?) 

如果內容包含一個或多個自動關閉的簡碼或一個或多個所包含的簡碼,則工作正常。但是,如果內容包含兩者的混合體,則它將不起作用。

不使用方括號[],而是使用大括號{},因爲這是Joomla中使用內容插件的方式。

現在請檢查下面的HTML片段:

<div id="lipsum"> 
    <p> 
     Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin pellentesque lectus tellus, ut tincidunt orci posuere non. Aliquam erat volutpat. Phasellus in lobortis dolor, porta varius nunc. Ut et felis rutrum, pharetra mi a, ullamcorper purus. In vitae fringilla velit. In nec scelerisque mauris, sed eleifend urna. Duis feugiat risus et arcu eleifend venenatis. 
    </p> 
    <h3>Shortcode 1</h3> 
    <p>{myshortcode shortcode="codeone"}</p> 
    <h3>Shortcode 2 - </h3> 
    <p>{myshortcode shortcode="anotherone"|param="test"} 
     {column}column 1{/column} 
     {/myshortcode} 
    </p> 
    <p> 
     Duis quis nisl fringilla, porttitor tellus a, congue mauris. Sed posuere erat vel metus egestas, eget lobortis dolor pretium. Proin iaculis pharetra consectetur. Sed in enim ultricies, sagittis nisl vitae, porttitor libero. Praesent ut erat nisi. Maecenas luctus magna lacus. Mauris ullamcorper maximus arcu et tincidunt. Aenean cursus enim blandit, scelerisque ex sed, vestibulum felis. In magna massa, sagittis in eleifend vel, tristique vitae nisi. 
    </p> 
</div> 

這裏的HTML同時包含自我封閉和封閉簡碼。在這種情況下,上面的正則表達式模式不起作用,因爲它將兩個簡碼匹配爲一個,從{myshortcode shortcode="codeone"}{/myshortcode}作爲單個簡碼。

所以我的問題是有一種模式,我可以用來匹配兩個短代碼?

請檢查它的當前狀態http://regex101.com/r/tF0mA9/1。在這裏我期待着兩場比賽。

謝謝你的幫助。

+0

http://codex.wordpress.org/Function_Reference/get_shortcode_regex – chiliNUT 2014-10-05 19:29:53

回答

3

這個怎麼樣?

{(}?)(theshortcode)(?![\w-])([^}\/\n]*(?:\/(?!})[^}\/]*)*?)(?:(\/)}|}(?:((?:(?!theshortcode)[^{])*+(?:{(?!\/\2})(?:(?!theshortcode)[^{])*+)*+){\/\2})?)(}?) 

DEMO