好的,我需要掃描許多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語法是有點矯枉過正我將簡化要求:
正則表達式可以假定只有以下
- 的電話永遠是在同一行
- 它總是從
swfobject.embedSWF
開始(區分大小寫) - 然後接着(或不)由空格,然後
(
- 然後接着(或不)由空白字符,然後(需要任一個,但一個2)
- 是一個
"
或'
再其次是文件名,然後 - 之後
"
或'
(如果我們能確保它是相同的字符,在4好,如果不是太糟糕了) - 是隨後(或沒有)的空格,然後
,
- 然後是任何東西
- 然後是
)
然後是任何空格(或不是)然後;
然後是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;
}
?>
我需要一個所有PHP解決方案,因爲一切都基於Web。 – Activist 2010-08-03 12:13:49
足夠簡單,可以用幾個循環和opendir/readdir和/或DirectoryIterator替換命令行grep,並執行自己的正則表達式。即使你僅限於基於http的遠程訪問,你仍然可以在php內部執行'exec' grep。 – 2010-08-03 17:34:52