如何获得边缘没有空格的文本节点?

How to get a text node without spaces at the edges?

如何从我的父节点返回第一个没有边缘空格的文本节点?

节点:

<p>Hello <b>World</b> by.</p>

你必须得到边缘没有空格的第一个单词:

→你好←

这样的 Xpath 查询:

p/[normalize-space(text()[1])]

Return一个错误:

DOMXPath::query():无效表达式

试试这个 XPath:

/p/text()[1]

如果您的 XPath 引擎支持这种表达式,可能还有这个:

normalize-space(/p/text()[1])

How do I get the first text node back from my parent without spaces at the edges?

你不能。 XPath 既可以 select 原样来自源文档的节点,也可以构建字符串、数字或布尔值等值。 (或者在 XPath 2.0 中,数据类型范围更广。)

因此您可以 select 文本节点,原样(即包含空格)使用

/p/text()[1]

或者您可以return通过修剪文本节点构造的字符串:

normalize-space(/p/text()[1])

但是对于某些 XPath API,您只能使用第一种表达式(returns 节点),或者如果您想使用第二种表达式(returns字符串),你必须以不同的方式调用它。

请注意,这两个表达式都非常脆弱:如果源文档与您的示例输入差异很小,它们将产生无用的结果。

DOMXpath:query() 不允许带有标量结果的 Xpath 表达式。您将不得不使用 DOMXpath::evaluate().

$xml = <<<'XML'
<p>Hello <b>World</b> by.</p>
XML;

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

var_dump(
    $xpath->evaluate('normalize-space(p/text()[1])', $document)
);

输出:

string(5) "Hello"

字符串函数必须在外面。所以你首先 select 节点,然后将结果转换为字符串。 p selects p 个上下文节点的子节点。 //p selects 文档中的任何 p 元素节点。所以 p/text()[1] 都是 p children.

内的第一个(位置)文本子节点

normalize-space() 会将第一个节点(从获取的列表中)转换为字符串,去除 trailing/leading 空格并将内部的所有空格组替换为单个空格。