Mar*_*arx 1 php preg-replace domdocument
我正在尝试捕获home_impact和away_impact,但是当我提取文本时,它充满了空白行,空白,断行等,如下所示:
David Luiz
35'
36'
De Gea
Run Code Online (Sandbox Code Playgroud)
我也尝试过仅提取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>
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
您只能使用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);
Run Code Online (Sandbox Code Playgroud)
使用 UTF-8 编码规范 PHP 中的空格,这就是 PHP 中的 DOMDocument 返回字符串的方式:
$normalized = preg_replace(['(\s+)u', '(^\s|\s$)u'], [' ', ''], $text);
Run Code Online (Sandbox Code Playgroud)
即首先将每个出现的空格减少为一个空格,然后在字符串的开头或结尾修剪空格。
与XML 标准中的2.10 空白处理进行比较。
trim()会消除你的空白;您可以使用正则表达式将玩家名称之间的空格替换为在此之前的非空格字符,以保留它,修剪掉所有其他空格,然后将单个所需的空格放回去,可能是:
echo str_replace("@WSW@", " ", trim( preg_replace("\^.*([\w]{1,})( )([\w]{1,}).*$\","@WS@", $nodesHome->item($i)->nodeValue)));
Run Code Online (Sandbox Code Playgroud)
但我还没有测试过它,正则表达式可能需要一些调整,并且可能可以使用 PCRE 代码进行优化。
取消该计划,我忘记了trim()将保留单个空格。这就是你想要的:
for ($i=0;$i<$nodesHome->length;$i++) {
echo trim($nodesHome->item($i)->nodeValue);
echo trim($nodesAway->item($i)->nodeValue);
}
Run Code Online (Sandbox Code Playgroud)