2010-08-02 98 views
2

好的,我需要掃描許多HTML/XHTML文檔以查看是否已經用SWFObject嵌入了特定文件。如果是這種情況,我需要將呼叫替換爲其他內容。PHP 5.3智能搜索並用正則表達式替換

到目前爲止,我已經提取了可以進行調用的<script>內容。現在我需要掃描這個字符串來檢查是否有呼叫,如果它在那裏,我需要替換它。

我知道這有點奇怪,但內容來自我們無法控制的第三方。

由於可以用許多不同的語法進行調用,因此我需要一個正則表達式來查找和替換調用。

OK想象以下場景:

如果文件test.swf在文件中嵌入的SWFObject我在尋找。

<script>內容是這樣的:

alert('test.swf'); 
//some other random stuff here 
swfobject.embedSWF("test.swf", 
"The alternative content can screw the regexp with);", "300", "120", 
"9.0.0", false, flashvars, params, attributes); 

現在我想換成swfobject.embedSWF(和所有參數)到別的東西。

有沒有一個不太可怕的方式來做到這一點?不要忘記,通話可以在一個或多個線路上,參數可以用單引號(')或雙引號(「)包裹,即空白可以全部圍繞...

編輯: OK,因爲捕獲所有類型的JS語法是有點矯枉過正我將簡化要求:

正則表達式可以假定只有以下

  1. 的電話永遠是在同一行
  2. 它總是從swfobject.embedSWF開始(區分大小寫)
  3. 然後接着(或不)由空格,然後(
  4. 然後接着(或不)由空白字符,然後(需要任一個,但一個2)
  5. 是一個"'再其次是文件名,然後
  6. 之後"'(如果我們能確保它是相同的字符,在4好,如果不是太糟糕了)
  7. 是隨後(或沒有)的空格,然後,
  8. 然後是任何東西
  9. 然後是)然後是任何空格(或不是)然後;然後是end of line

這應該是更簡單的解析這種方式(我猜)。

編輯2:我煮了一個解決方案。我認爲我很接近,但它不起作用,任何人都可以提供幫助? 0應該匹配,但它不是...

<?php 

$myFilename = 'test.swf'; 
$testCases = array(); 
$testCases[] = 'swfobject.embedSWF("test.swf", "The alternative content can screw the regexp with);", "300", "120", "9.0.0", false, flashvars, params, attributes);'; 

foreach ($testCases as $i => $currTest) 
{ 
    $currResult = preg_match('/\s*swfobject\.embedSWF\s*\(\s*(["\'])(' . preg_quote($myFilename) . ')[^"\']+\1\s*,[\s\S]+?\)\s*;\s*$/', $currTest); 
    if ($currResult === false || $currResult < 1) 
     echo $i, ' Not matching', PHP_EOL; 
    else 
     echo $i, ' Matching', PHP_EOL; 
} 

?> 

回答

1

在問候你EDIT2 ...

我不是最好的正則表達式,但你可以嘗試:

$currResult = preg_match('/\s*swfobject\.embedSWF\s*\(\s*(["\'])(' . preg_quote($myFilename) . ')\1\s*,[\s\S]+?\)\s*;\s*$/', $currTest); 

似乎爲我的工作確定。

1

在命令行中使用'grep'或類似命令來獲取包含您需要的.swf/script/object字符串的文件列表。這將減少您需要處理的文件數量。

然後,使用PHP腳本將這些文件中的每一個文件拖拽到您選擇的DOM解析器中,並在那裏進行替換/修復。

+0

我需要一個所有PHP解決方案,因爲一切都基於Web。 – Activist 2010-08-03 12:13:49

+0

足夠簡單,可以用幾個循環和opendir/readdir和/或DirectoryIterator替換命令行grep,並執行自己的正則表達式。即使你僅限於基於http的遠程訪問,你仍然可以在php內部執行'exec' grep。 – 2010-08-03 17:34:52

2

那麼,有人有時間在PHP中編寫a basic javascript parser。我會嘗試使用標記器(可能使用HTML解析器首先查找<腳本>節點)。

+0

我只需要正則表達式來查找其他所有內容已經完成的調用。 – Activist 2010-08-03 12:14:17

+2

你想要一個正則表達式,它可以從一個字符串的開始直到結束時計算所有開始和結束引號,並在這些之前正確識別轉義字符。從本質上講,這不是一個正則表達式的工作,而是一個解析器。我給你的解決方案對於下一個程序員來說是很容易操作和可讀的,只需在改變參數(如果存在的話)容易完成之後循環通過標記器的結果之後就可以實現內部代碼。我不會花費2到3個小時的時間用+300 char正則表達式,這可能仍然不能解釋我忘記的邊緣情況。你不應該這樣做:) – Wrikken 2010-08-03 12:24:45

+0

好吧,如果這是不可能的一個簡單的正則表達式,我會尋找另一種解決方案,然後。 – Activist 2010-08-03 12:51:01

相關問題