2012-05-17 109 views
0

我想,如果拋出驗證錯誤 -PHP的標籤忽略XML標籤的正則表達式匹配

  • 用戶輸入包含PHP標籤<?php(也簡稱爲標籤<?
  • ,但我想允許XML標記(<?xml )如果沒有檢測到PHP標籤。
  • 在兩者的存在下,我想拋出錯誤。

我一直高達現在下面的正則表達式 -

`(.*?)<\?(php)?[^xml](.*?)` 

但如果輸入僅包含PHP短標記不匹配。

我想匹配以下 -

PHP短標記

<? 

PHP標籤

<?php 

在XML標籤的存在PHP標籤

<?php ?> 
<?xml 

不匹配以下

<?xml 

更新

使用這個表達式(.*?)<\?[^x](.*?)如果輸入僅包含<?沒有檢測<?系統字符,沒有任何結束的空白。我想我只需要在以下位置添加一個條件,以進一步檢查只有當更多的字符有 -

  | 
     v 
`(.*?)<\?[^x](.*?)` 

如果我這個嘗試 - (.*?)<\?([^x]?)(.*?),它不再排除xml。你看到我掛在哪裏嗎?我猜這裏有一些正則表達式允許的。有任何想法嗎?

回答

2

您是否需要正則表達式?爲什麼不只是做:

if file contains '<?php' 
    throw an error 
if file contains '<?' but *doesn't* contain '<?xml' 
    throw an error 

編輯在評論中提到,這將不包括含有<?<?xml(雖然你可以指望的<? OCCURENCES數的文件,如果這個比數大<?xml,然後拋出一個錯誤)。

Re正則表達式,你有幾個選項。如果您正則表達式的味道支持負向前看符號,你可以找一個<?後跟一個「X」:

<\?(?!x) 

,或者如果它不支持負向前看符號,你可以嘗試

<\?([^x]|$) 

其中任何一個都會尋找PHP標誌的存在。

+0

感謝您的回答。當我必須檢查PHP標籤的存在時,我最初沒有使用正則表達式。後來當我需要額外檢查XML標籤時,我選擇了正則表達式。我想,我不清楚什麼時候切換到正則表達式匹配的基本原理。在我的情況下,正則表達式會是一種矯枉過正的行爲嗎?無論如何,如果輸入只包含<<?',而沒有任何結尾空格,則使用此正則表達式'(。*?)<\?[^ x](。*?)'不會檢測到<?'特徵。有任何想法嗎? –

+0

如果我使用這個邏輯if(文件包含'<?php')或(文件包含'<?'但*不包含'<?xml')',包含'<?'和< ?xml'不會拋出錯誤(這個輸入不會拋出錯誤 - '<?<?xml')。我想,如果必須進行非正則表達式檢查,我需要進一步檢查一些位置或每場比賽的數量。那麼,你認爲在這種情況下正則表達式檢查會更好嗎? –

+0

啊,謝謝你指出。我會更新我的答案。 –

1

你正在尋找的正則表達式是:

/<\?(?!xml)(?:php|.{0,3})/s 

這裏是PHP代碼示例:

if (preg_match("/<\?(?!xml)(?:php|.{0,3})/s", $str)) 
    echo "Not allowed\n"; 
0

請記住,如果你使用這個表達式:

<\?(?!x) 

<\?([^x]|$) 

啓用short_open_tags後,您仍然很容易受到攻擊。這條線將輸出的Hello World:

<?xml_error_string(1); echo 'Hello World!'; ?> 

我只能想出這個表達式

<(\?([^x]|xml_.*?)|\%) 

但後來你還是留下了這個片段...

error_string(1); echo 'Hello World'; ?> 

我對於更好的解決方案而言,我們已經厭倦了,但它仍然會比運行的代碼更好。 ;-)

+0

我認爲在OP的情況下,解析輸入比使用正則表達式更適用。 – Stephan