[英]PHP preg_match regex (2)
大家好,我遇到了问题,我有以下代码:
<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>
我需要在screenfile=
之后获取该值,例如以下内容: http : screenfile=
,但是我不知道该怎么做,并且还需要替换宽度和高度属性。
这是一个关于SO的常见问题,答案始终是相同的:正则表达式对于解析或处理HTML或XML来说是一个糟糕的选择。 它们可以通过多种方式分解。 PHP至少具有三个内置的HTML解析器,它们将更加健壮。
看一下使用PHP和DOM解析HTML,并使用类似以下内容:
$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;
}
遵循以下原则:
$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];
}
未经测试,但您明白了。 我会尽量避免使用正则表达式来解析HTML,尽管在这种情况下,仅使用正则表达式是可行的(但是由于示例代码和实际情况会有所不同,因此我仍然建议使用基于解析器的方法)。
使用/screenfile=([^&]+)/
查找screenfile的值。 $1
将包含所需的值。 使用regex解析html不是一个好主意。
更改宽度:
replace `/\bwidth="\d+"\b/` with width="423"
更改高度:
replace `/\bheight="\d+"\b/` with height="565"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.