好的,我需要扫描许多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语法有点矫枉过正我会简化要求:
正则表达式只能采用以下
swfobject.embedSWF
(区分大小写)(
"
或'
(其中一个只需要其中一个)"
或'
(如果我们可以确保它是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;
}
?>
答案 0 :(得分:2)
好吧,有人有时间在PHP中编写a basic javascript parser。我会尝试使用标记器(可能使用HTML解析器来首先找到&lt; script&gt;节点)。
答案 1 :(得分:1)
在命令行中使用'grep'或类似命令获取包含所需的.swf / script / object字符串的文件列表。这将减少您需要处理的文件数量。
然后,使用PHP脚本将每个文件粘贴到您选择的DOM解析器中,并在那里进行替换/修复。
答案 2 :(得分:1)
关于 EDIT2 ......
我不是最好的正则表达式,但你可以尝试:
$currResult = preg_match('/\s*swfobject\.embedSWF\s*\(\s*(["\'])(' . preg_quote($myFilename) . ')\1\s*,[\s\S]+?\)\s*;\s*$/', $currTest);
似乎对我有用。