2009-03-03 37 views
0

我需要解析和返回標記名,並在我們的PHP代碼文件的屬性解析HTML時>:逃離 - >和=使用正則表達式

<ct:tagname attr="attr1" attr="attr2"> 

爲此,下面的正則表達式已建成:

(\<ct:([^\s\>]*)([^\>]*)\>) 

這個表達式按預期工作,但它打破時,下面的代碼解析

<ct:form/input type="attr1" value="$item->field"> 

原始正則表達式因$ item->字段中的>字符而中斷。我需要構造一個忽略 - >或=>而不是單個>的正則表達式。

我很樂意提供任何建議...感謝您的幫助提前。

回答

1

你可以嘗試使用負回顧後發這樣的:

(\<ct:([^\s\>]*)(.*?)(?<!-|=)\>) 

匹配:

<ct:tagname attr="attr1" attr="attr2"> 
<ct:form/input type="attr1" value="$item->field"> 

不知道它對於你的情況最適合的解決方案,但尊重的約束。

+0

謝謝,這個工作對我來說很好! – gyurisc 2009-03-03 14:01:01

+0

但它會導致不可迴避的回溯。 – Gumbo 2009-03-03 14:03:56

0

我認爲你想要做的是不承認->=>,但忽略引號對之間的所有內容。

我認爲它可以通過在適當的位置插入((

("[^"]*")* 

))來完成。

1

一般來說,任何解析問題都會迅速進入無上下文但不規則的語言結構。這可能是一種更好的[1]解決方案,可以編寫上下文無關的解析器,忽略除您感興趣的元素以外的所有內容。

[1]從「正確的事物」的角度看,「更好」必然是投資回報之一。

2

試試這個:

<ct:([^\s\>]*)((?:\s+\w+\s*=\s*(?:"[^"]*"|'[^']*')\s*)*)> 

但是,如果這是XML,使用中應更好地使用XML解析器。

+0

+1'使用XML解析器'。您無法使用正則表達式可靠地解析XML,完全停止。 – bobince 2009-03-03 14:46:33

0

我的建議是匹配相同表達式中的屬性。

\<ct:([^\s\>]*)((([a-x0-9]+)=\"([^\"]*)\")*)\> 

編輯:約除去一部分>不是在屬性值有效xml