2013-02-10 26 views
1

我目前正在構建一個可以接收請求併發迴響應的Web服務器。 我已經設法將Google的v8 JavaScript引擎的一個端口嵌入到我的項目的c#(javascript.net)中,並且我想解析所請求的文件並運行其中的服務器端JavaScript代碼。我決定將這些代碼包含在2個字符的括號內,<:用於打開和:>用於關閉。我開始用我編寫的代碼解析它,但是在遇到一些使代碼更加混亂並且可能效率不高的問題之後,我決定繼續嘗試使用RegEx(因爲我以前從未使用過,所以我研究過它)。可是等等。在與我的朋友談論此事後,他給我發了這篇文章RegEx match open tags except XHTML self-contained tags我明白這不是一個好主意...... 所以我的問題是,我該如何解析這樣的事情? (考慮到效率和乾淨的代碼,畢竟它是一個網絡服務器)。 在此先感謝!解析一個包含HTML的文件以獲得服務器端腳本

+0

我正在試圖抓取一個文件,並將其中的所有內容寫在這個<:和this:>之間。 例如在php中你有一個包含html代碼和php代碼的文件,所有的php代碼都在之內,並且解析該文件的東西在這些括號內提取了php代碼。 – UnTraDe 2013-02-10 22:17:25

+0

他們不發送文件,他們發送一個請求服務器上已經存在的文件。例如你輸入127.0.0.1:8080/test.html 127.0.0.1的服務器發送一個包含test.html內容的響應,但是我想首先解析它並獲取所有服務器端腳本 – UnTraDe 2013-02-10 22:25:57

+0

好的,謝謝你是評論,你能否把我推薦到解釋這些概念的地方?以爲我在想我知道我在說什麼,但我已準備好更深入地理解你在說什麼。 – UnTraDe 2013-02-10 22:32:16

回答

0

理想情況下,你想要做的就是掛鉤V8的詞法分析器,這樣你就不會在字符串等內部捕捉到東西。然而,我查看了.NET包裝器的源代碼,看起來它不允許那麼多的自定義。相反,你可能想創建一個小型狀態機。你可能會想,至少這些狀態:

  • 文字數據(您<::>標籤以外的東西)
  • 左尖括號(因爲一旦你已經消耗了<,正在等待一個潛在的:
  • 腳本狀態(您<::>標籤裏面的東西)
  • 腳本雙引號串狀態
  • 腳本雙引號字符串逃過狀態
  • 腳本單引號的字符串狀態
  • 腳本單引號的字符串逃過狀態
  • 腳本斜線狀態(徵求意見和正則表達式)
  • 腳本註釋行狀態
  • 腳本塊註釋狀態
  • 腳本塊註釋明星狀態
  • 腳本正則表達式狀態
  • 腳本冒號狀態(用於當你'已經遇到了:和不確定一個>或別的東西,是否是下一個)

它可能不會那麼快寫爲正則表達式,但它能夠處理這樣的代碼:

Hello, world! 
<: 
    document.write("At least you won't think the script :> ends there."); 
:> 

第二個想法是,檢測正則表達式可能並不那麼容易。

+0

我知道RegEx沒有解決這個任務的問題(因爲安全問題?),我想知道他們是如何在運行php/jsp/.net等的web服務器中執行的。是否有一種常用方法可用於這種情況? – UnTraDe 2013-02-10 22:43:25

+0

@UnTraDe:我不知道JSP和.NET如何實現,但PHP已將其集成到其解析器中。正如我在回答開始時所說的,理想的方法是掛鉤V8並執行相同的操作,但是.NET包裝器不允許它。 – icktoofay 2013-02-10 22:44:19

+0

我可以在這裏選擇切換到C++並使用原始的v8引擎(我之前在C++中使用過v8),但由於它是一個「有趣」的項目,我只是爲了好玩,我認爲編寫和更快在C#中生成一個功能正常的Web服務器,特別是使用.NET包裝器,這使得將js代碼嵌入到C#代碼中變得更加容易。但是如果你認爲使用C++解析它會更容易(也許v8有類似於你在上面的評論中提到的東西,或者C++庫),我認爲它值得麻煩切換。 – UnTraDe 2013-02-10 22:50:39

0

如果我理解的很好,你想把「<」和「>」之間的所有內容,甚至是「<」和「>」都放在裏面嗎?那麼...既然你可以使用正則表達式,也許試着找到第一個「<」,使計數器會增加下一個「<」,並減少每個「>」。當計數器爲0時,下一個「>」出現:在這裏你有服務器端腳本的結束。如果你有一些嵌入式HTML並想擺脫它們,試着檢測「」「」或類似的東西。這個解決方案很慢,但我能想象的最簡單。

+0

謝謝你的回答,但從我在問題中提到的帖子中看到的內容中,我明白使用正則表達式並不是一個好主意。你的想法聽起來像一個解決方案,但你說它很慢,我真的需要在這裏進行性能優化。如果你有一個更好的主意,哪個會更快地工作,請給我解釋一下,就像你在做的那樣。 – UnTraDe 2013-02-10 22:36:35