PHP preg_match regex (2)

3 Cevap php

Merhaba ben bir sorun yaşıyorum beyler, ben aşağıdaki kodu var:

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,115,0" width="320" height="240">
<param name="movie" value="http://www.domain.com" />
<param name="quality" value="high" />
<param name="wmode" value="opaque" />
<param name="allowfullscreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="FlashVars" value="file=http://www.domain.com/file.flv&screenfile=http://domain.com/file.jpg&dom=domain.com" />
<embed src="http://www.domain.com" width="320" height="240" bgcolor="#000000" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" allowfullscreen="true" flashvars="file=http://domain.com/file.flv&screenfile=http://domain.com/file.jpg&dom=domain.com" />
</object>

I screenfile=, örneğin bu bir sonra değerini almak gerekir: http://domain.com/file.jpg, ama ben o, ve ben de genişlik ve yükseklik propertis değiştirmeniz gerekiyor nasıl yapabilirim hiçbir fikrim yok .

3 Cevap

/screenfile=([^&]+)/ screenfile değerini bulmak için kullanın. $1 istenen değer içerecektir. Regex ile html ayrıştırma olsa iyi bir fikir değildir.

Genişliğini değiştirmek için:

  replace `/\bwidth="\d+"\b/` with width="423"

Yüksekliğini değiştirmek için:

  replace `/\bheight="\d+"\b/` with height="565"

Bu çok üzerinde ortak bir soru ve cevap hep aynı: düzenli ifadeler ayrıştırma veya işleme HTML veya XML için kötü bir seçimdir. Onlar yıkmak birçok yolu vardır. PHP çok daha sağlam olacak en az üç yerleşik HTML ayrıştırıcıların ile birlikte gelir.

Parse HTML With PHP And DOM bir göz atın ve benzeri bir şey kullanın:

$html = new DomDocument;
$html->loadHTML($source); 
$html->preserveWhiteSpace = false; 
$params = $html->getElementsByTagName('param');
foreach ($params as $param) {
  if ($param->getAttribute('name') == 'FlashVars') {
    $params = decode_query_string($param->getAttribute('value'));
    $screen_file = $params['screenfile'];
  }
}
$embeds = $html->getElementsByTagName('embed');
$embed = $embed[0];
$embed->setAttribute('height', 300);
$embed->setAttribute('width', 400);
$raw_html = $html->saveHTML();

function decode_query_string($url) {
  $parts = parse_url($url);
  $query_string = $parts['query'];
  $vars = explode('&', $query_string);
  $ret = array();
  foreach ($vars as $var) {
    list($key, $value) = explode('=', $var, 2);
    $ret[urldecode($key)][] = urldecode($value);
  }
  return $ret;
}

: Hatları boyunca

$html = '<your HTML here>';

$dom = new DOMDocument;
$dom->loadHTML($html);

$xpath  = new DOMXPath($dom);
$result = $xpath->query('//object/param[@name = "FlashVars"][1]/@value');

foreach ($result as $node) {  // there should only be one
  preg_match(/screnfile=([^&]+)/, $node->nodeValue, $matches);
  print $matches[1];
}

Denenmemiş, ancak fikir olsun. Ben bu durumda could iş yalnız regex kullanarak (ama örnek kod ve gerçeklik sapmak eğilimindedir beri, ben hala bir ayrıştırıcı temelli yaklaşımı öneriyoruz) olsa da, mümkün HTML ayrıştırmak için regex kullanarak önleyeceğini.