PHP 5.3 akıllı arama ve düzenli ifadeler ile değiştirin

0 Cevap php

Tamam, ben belirli bir dosya SWFObject ile gömülü olup olmadığını görmek için birçok HTML / XHTML belgeleri taramak gerekir. Bu durumda ise, başka bir şey için çağrı değiştirmeniz gerekiyor.

Şimdiye kadar ben aramalar yapılabilir <script> içeriklerini elde var. Şimdi çağrı olup olmadığını denetlemek için bu dizeyi taramak gerekir ve varsa bunu değiştirmeniz gerekir.

Bu biraz garip olduğunu biliyorum, ama içerik biz kontrol yok, bir üçüncü parti geliyor.

Çağrı birçok farklı sözdizimi yapılabilir beri, ben aramaları bulmak ve değiştirmek için normal bir ifade gerekir.

Tamam Aşağıdaki senaryoyu düşünün:

Dosya test.swf dosyasına SWFObject ile gömülü ise ben arıyorum.

<script> içeriği şöyle:

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

Şimdi başka bir şey için swfobject.embedSWF olarak değiştirin (ve tüm parametreler) istiyorum.

Bunu yapmak için bir çok korkunç değil bir yolu var mı? Çağrı parametreleri boşluk çevresinde olabilir, tek tırnak (') veya çift tırnak (") ile sarılmış olabilir, bir veya birçok hatlarında olabilir unutmayın ...

EDIT: Tamam JS sözdizimi her türlü alıcı beri gereksinimi basitleştirecek biraz overkill:

Düzenli ifadeler sadece aşağıdaki varsayabiliriz

  1. Çağrı aynı hat üzerinde her zaman
  2. Her zaman ile başlar swfobject.embedSWF (küçük harf duyarlı)
  3. Daha sonra takip (ya da değil) whitespaces tarafından ve daha sonra ( edilir
  4. Daha sonra takip (ya da değil) whitespaces ile ve daha sonra bir " ya da ' (bir, ama 2 bir ya da gereklidir) mi
  5. Sonra dosya takip ediyor
  6. (Biz bu 4 iyi çok kötü değilse aynı karakter olduğunu sağlayabilirsiniz varsa) daha sonra " veya ' tarafından takip edilir
  7. Daha sonra takip (ya da değil) whitespaces tarafından ve daha sonra , edilir
  8. Sonra hiçbir şey tarafından takip edilir
  9. Sonra takip ) sonra herhangi boşlukları (veya değil) sonra ; daha sonra bir end of line.

O (sanırım) bu şekilde ayrıştırmak çok daha kolay olmalıdır.

EDIT 2: Ben bir çözüm pişmiş ettik. Ben yakın olduğum ama herkes yardımcı olabilir, çalışmıyor düşünüyorsun? 0 eşleşmesi gerekir ama öyle değil ...

<?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 Cevap