[英]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過正,我將簡化要求:
正則表達式只能假設以下內容
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編寫了一個基本的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.