Как использовать XPath для захвата части тега ap - PullRequest
0 голосов
/ 03 апреля 2020

Я видел много подобных вопросов здесь, но все еще не могу заставить работать мой конкретный вариант использования. XPath newby здесь.

У меня есть следующий фрагмент ruby code

        post_html = Nokogiri::HTML(post.raw)
        @restricted_file_types = SiteSetting.file_attachment_whispers_file_extensions.split('|')
        Rails.logger.info "searching for restricted extensions #{@restricted_file_types.inspect}"
        Rails.logger.info "post is: #{post_html}"


        # trying to get links
        tags = post_html.xpath("//p[contains(., '\[.*')]")
        Rails.logger.info "tag from regex: #{tags}"

        tags.each do |attachment| 
            Rails.logger.info "p tag found in parsing"
            Rails.logger.info "#{attachment}"
            does_contain = @restricted_file_types.any? {
                |extension| attachment.include?(extension)
            }

            Rails.logger.info 'checking for restricted'
            if contains_restricted?(attachment)
                Rails.logger.info 'contains restricted'
                links.push(attachment)
                node = post_html.create_element 'p'# create paragraph element
                node.inner_html = SiteSetting.file_attachment_whispers_message
                attachment.replace '[color=red]' + node + '[/color]' # replace found link with paragraph
                post.raw = post_html
                post.save!
                hasUpdated = true
            end
        end

post.raw будет содержать что-то похожее на структуру этого примера.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>this is a dog that borks. Image of dog attached.

[3408.zip|attachment](upload://szj2cSHQnbp8zsuBeC7ZsZ9mllg.zip) (19.7 KB)</p></body></html>

Моя цель - заменить ссылку на файл сообщением. Чтобы сделать это, я пытался захватить только эту часть html, чтобы все это изменить, а затем переписать. Я застрял на том, как правильно использовать xpath в этой ситуации. post_ html .xpath ("// p [содержит (., '[. *')]") не работает.

Я не до конца понимаю, что делает первый параметр в xpath, так как я получил это из другого примера. Я также не понимаю, как это возвращается ни с чем не соответствует. Может кто-нибудь объяснить, что именно это делает и почему не работает?

Спасибо:)

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете использовать что-то вроде:

concat(substring-before(//p,"["),"I love dogs")

Во-первых, для каждого элемента p мы извлекаем все до «[» с помощью функции substring-before. Затем мы «вставляем» нужное нам сообщение с помощью concat.

Вывод:

this is a dog that borks. Image of dog attached. I love dogs
...