簡體   English   中英

PHP 5.3智能搜索並用正則表達式替換

[英]PHP 5.3 smart search and replace with regular expressions

OK,我需要掃描許多HTML / XHTML文檔,以查看SWFObject是否已嵌入特定文件。 如果是這樣,我需要將呼叫替換為其他呼叫。

到目前為止,我已經提取了可以進行調用的<script>內容。 現在,我需要掃描該字符串以檢查該呼叫是否存在以及是否存在,我需要替換它。

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

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

可以想象以下情況:

我正在搜索文件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 (和所有參數)替換為其他東西。

有沒有一個不太可怕的方式來做到這一點? 不要忘了調用可以在一行或多行上,參數可以用單引號(')或雙引號(“)包裹,空格可以在所有地方...

編輯:確定,因為捕獲所有JS語法有點矯over過正,我將簡化要求:

正則表達式只能假設以下內容

  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;
}

?>

好吧,有人花時間用PHP編寫了一個基本的JavaScript解析器 我會嘗試令牌生成器(可能使用HTML解析器首先找到<script>節點)。

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

然后,使用PHP腳本將所有這些文件插入到您選擇的DOM解析器中,並在那里進行替換/修復。

關於您的EDIT2 ...

使用正則表達式不是最好的方法,但是您可以嘗試:

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

似乎可以為我工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM