我正在嘗試用普通的 php 廢棄 Wikipedia 頁面,并一直xpath->query用于搜索 dom。我正在嘗試選擇Known for在此 Wikipedia 頁面上有文本的節點https://en.wikipedia.org/wiki/Ajmal_Kasab 文本位于文本之前的右側表格中2008 Mumbai attacks。我用 加載了頁面DOMDocument::loadHtml,并執行了以下操作:
var_dump( $value->saveHTML($xpath->query( "//table[@class[contains(.,'infobox')]]//tr[th='Known for']/th/text()" )[0]) );
我想Known\x20for,Known for和Known for等,但他們沒有作業。幸運的是,我偶然發現了這個Using XPATH to search text contains 發布并嘗試Alt 0160在 sublime 3 編輯器中手動按下我的 Windows 10 電腦。運算式看起來像這樣Known<0xa0>for——它起作用了。
我的問題 1是為什么 xpath 不接受普通空格 或文字 ?維基百科頁面來源將其作為Known for. 如果我有 Linux 或不同的文本編輯器怎么辦?目前,我在本地作業,它也可以在我的基于 Linux 的服務器上作業嗎?這背后的計算機科學是什么?
其次,我需要將xpath包含空格的結果集轉換為存盤<0xa0>. 我有:
$tmp = $xpath->query("//table[@class[contains(.,'infobox')]]//tr[th='Known<0xa0>for']/th/text()");
$tmp = $domDomoc->saveHTML($tmp[0]);
$result = $xpath->query("//table[@class[contains(.,'infobox')]]//tr[th='{$tmp}']/td/text()");
似乎變數$tmp不成立<0xa0>,反過來又不$result正確(假)。
整個php代碼比較復雜,要搜索的詞很多。所以我將代碼歸結為一個更簡單的任務。像這樣Known for的詞是動態的,并被輸入到一個函式中。
uj5u.com熱心網友回復:
您聲稱“維基百科頁面來源將其作為Known for”這根本不是真的,它有Known for. 其次,您呼叫 文字,即使您的意思是 ,它不是文字,它是 HTML 數字字符參考,即 HTML 必須不使用文字字符的轉義機制。當然,您的 XPath 不適用于 HTML 源代碼,您已將字串提供給loadHtml使用 HTML 決議器決議 HTML 源字串的方法,因此生成的 DOM 樹當然沒有任何形式的表示 或&nbnsp;,它只有一個帶有Unicode字符的文本節點,其中之一是帶有十進制Unicode 160或十六進制U00A0的字符。
XPath 和 PHP 都不要求您在 PHP 字串文字 ( https://www.php.net/manual/en/language.types.string.php ) 中轉義該字符<0xa0>,它應該是\xA0.
對于問題的第二部分,您希望從中獲得什么樣的價值$xpath->query("//table[@class[contains(.,'infobox')]]//tr[th='Known<0xa0>for']/th/text()")?DOM 節點串列?通過將該變數放入另一個 PHP 字串文本中,您希望實作什么$xpath->query("//table[@class[contains(.,'infobox')]]//tr[th='{$tmp}']/td/text()")?
如果您想要來自 XPath 評估的 PHP 字串,請使用不回傳節點而是字串的運算式(string(//th)將回傳具有第一個th元素的字串值的字串)并使用evaluate方法,而不是query方法,例如
$doc = new DOMDocument();
$doc->loadHTML(file_get_contents('https://en.wikipedia.org/wiki/Ajmal_Kasab'));
$xpath = new DOMXPath($doc);
$value = $xpath->evaluate("string(//tr[th = 'Known\u{00A0}for']/td)");
echo $value;
uj5u.com熱心網友回復:
XPath 旨在托管在其他編程語言(在您的情況下為 PHP)中,而不是擁有自己的轉義約定,它依賴于宿主語言的轉義約定。因此,您在 XPath 運算式中輸入 NBSP (xa0) 字符的方式與在任何其他 PHP 字串文字中輸入它的方式相同,例如\xA0.
 當 XPath 托管在 XML 中或 托管在 HTML 中時將是合適的,但當它托管在 PHP 中時則不合適。
你問“這背后的計算機科學是什么?”。基本上,它是為了避免雙重轉義問題。當諸如 regex 之類的子語言具有轉義約定(例如\\代表\),然后以具有類似轉義約定的另一種語言托管時,您最終不得不撰寫\as \\\\(或&as &amp;)。由于 XPath 是專門為在其他語言中托管而設計的,因此他們決定使用宿主語言轉義功能而不是疊加它們自己的功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/392435.html
