Невозможно манипулировать текстом после / следующего брата с XPATH и PHP

1

Привет, я пытаюсь манипулировать текстом после выражения с помощью 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],",")')

Любая помощь, чтобы исправить это, пожалуйста? Большое спасибо

  • 0
    Можете ли вы показать фактический HTML, который вы анализируете?
  • 0
    Конечно: <tr> <th> Code </th> <td> 36247, 38254, 95006, 095013 </td> </tr>
Показать ещё 3 комментария
Теги:
xpath

2 ответа

0

Ваше выражение xpath, использующее susbstring-after() выглядит многообещающим. Но обратите внимание, что DOMXPath::query() не может возвратиться, кроме набора узлов. Для выполнения выражения xpath, которое не возвращает узел, т.е. функцию substring-after(), вместо этого используйте DOMXPath::evaluate():

$xpath->evaluate('substring-after(//th[contains(., "Code")]/following-sibling::*[1],",")');
  • 0
    <?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
  • 0
    Здравствуйте, это мой полный код и результаты всегда пустые. Не могли бы вы проверить, что я делаю не так? Извините за грязный код, я не умею его форматировать здесь. @ Дмитрий-pastovenskyi
Показать ещё 2 комментария
0

Это должно сработать для вас

substring-after(/tr/th[.='Code']/following-sibling::td, ',')

Незначительное улучшение, которое вам может понадобиться (удаление пробелов до и после)

normalize-space(substring-after(/tr/th[.='Code']/following-sibling::td, ','))
  • 0
    К сожалению, не работают. Возвращает пустую строку. Если я удаляю функцию, я получаю результаты, очевидно, не манипулируемые.
  • 0
    Спасибо Дмитрий. Ваши ответы также действительны, за исключением того, что мне пришлось заменить одиночную на двойную косую черту.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню