Привет, я пытаюсь манипулировать текстом после выражения с помощью XPATH и PHP, но не работает.
->query('//th[contains(., "Code")]/following-sibling::*[1]')
Результат:
111,222,333
Ожидается:
222,333
Или идеально, если бы это взорвалось в массиве для дальнейших манипуляций
[111]
[222]
[333]
Я пробовал это без успеха:
->query('//th[contains(., "Code")]/following-sibling::*[substring-after(.,",")]')
->query('substring-after(/th[contains(., "Code")]/following-sibling::*[1],",")')
->query('//th[contains(., "Code")]/substring-after(/following-sibling::*[1],",")')
Любая помощь, чтобы исправить это, пожалуйста? Большое спасибо
Ваше выражение xpath, использующее susbstring-after()
выглядит многообещающим. Но обратите внимание, что DOMXPath::query()
не может возвратиться, кроме набора узлов. Для выполнения выражения xpath, которое не возвращает узел, т.е. функцию substring-after()
, вместо этого используйте DOMXPath::evaluate()
:
$xpath->evaluate('substring-after(//th[contains(., "Code")]/following-sibling::*[1],",")');
<?php $body='<html><head> <title>xpath test</title></head><body><table><tr> <th>Code</th> <td> 36247, 38254, 95006, 095013 </td> </tr></table></body></html>'; $DOM = new \DOMDocument(); $DOM->loadHTML($body); $xpath = new \DomXPath($DOM); $nodes=$xpath->evaluate('substring-after(/th[contains(., "Code")]/following-sibling::*[1],",")'); print_r($nodes); //returns empty
Это должно сработать для вас
substring-after(/tr/th[.='Code']/following-sibling::td, ',')
Незначительное улучшение, которое вам может понадобиться (удаление пробелов до и после)
normalize-space(substring-after(/tr/th[.='Code']/following-sibling::td, ','))
<tr> <th> Code </th> <td> 36247, 38254, 95006, 095013 </td> </tr>