我试图捕捉home_impact和away_impact但是当我提取文本时,它充满了空白线条,空格,断行等等:
David Luiz
35'
36'
De Gea
我也尝试过提取div id match_info但它只生成一个包含一个元素的数组,并且它还有很多换行符。我尝试过使用preserveWhiteSpace和preg_replace但是没有工作,任何想法如何避免?感谢。
HTML:
<div id="match_info">
<div class="direct_line">
<div class="home_impact"><div class='player_name'>David Luiz </div></div>
<div class="minute">35'</div>
<div class="away_impact">
</div>
</div>
<div class="direct_line">
<div class="home_impact"></div>
<div class="minute">36'</div>
<div class="away_impact">
<div class='player_name'>De Gea</div>
</div>
</div>
<div class="direct_line">
<div class="home_impact"></div>
<div class="minute">38'</div>
<div class="away_impact">
<div class='player_name'>Ashley Cole</div>
</div>
<div class="home_impact"><div class='player_name'>Juan Mata</div>/div>
<div class="minute">35'</div>
<div class="away_impact">
</div>
</div>
PHP:
$html = file_get_contents($url);
$doc = new DOMDocument();
//$doc->preserveWhiteSpace = FALSE;
@$doc->loadHTML($html);
$xpath = new DOMXpath ($doc);
$expresionHome="//div[@class='home_impact']";
$expresionAway="//div[@class='away_impact']";
$nodesHome = $xpath->evaluate($expresionHome);
$nodesAway = $xpath->evaluate($expresionAway);
for ($i=0;$i<$nodesHome->length;$i++)
{
echo $nodesHome->item($i)->nodeValue;
echo $nodesAway->item($i)->nodeValue;
}
答案 0 :(得分:5)
您只能在不修改节点内容或使用正则表达式的情况下使用DOMDocument。请考虑以下示例,请注意DOMDocument属性 preserveWhiteSpace 和 formatOutput (如果您想要漂亮打印它)
// DOMDocument with unformatted content
$unformatteddocument= new DOMDocument("1.0", "utf-8");
$unformatteddocument->load(PATH_OF_UNFORMATTED_XML);
$document = new DOMDocument("1.0", "utf-8");
$document->preserveWhiteSpace = false;
$document->formatOutput = true;
$document->loadXML($unformatteddocument->saveXML());
$document->save(PATH_FOR_FORMATTED_XML);
答案 1 :(得分:3)
使用UTF-8编码规范化PHP中的空格,这是PHP中DOMDocument返回字符串的方式:
$normalized = preg_replace(['(\s+)u', '(^\s|\s$)u'], [' ', ''], $text);
首先将空白现象减少到一个单独的空间,然后在字符串的开头或结尾修剪空格。
与XML标准中的2.10 White Space Handling进行比较。
答案 2 :(得分:1)
trim()
将摆脱你的白色空间;你可以正则表达式替换你的播放器名称之间的空白字符与之前的非空白字符,以保留它,修剪所有其他空白区域,然后将单个所需的空格放回,可能:
echo str_replace("@WSW@", " ", trim( preg_replace("\^.*([\w]{1,})( )([\w]{1,}).*$\","@WS@", $nodesHome->item($i)->nodeValue)));
但是我没有对它进行测试,正则表达式可能需要稍微调整一下,并且可能会使用PCRE代码进行优化。
抓住那个计划,我忘记了trim()会保留单个空格。这就是你想要的:
for ($i=0;$i<$nodesHome->length;$i++) {
echo trim($nodesHome->item($i)->nodeValue);
echo trim($nodesAway->item($i)->nodeValue);
}