我有一个包含特殊字符序列的HTML字符串,如下所示:
[start_tag attr="value"][/end_tag]
我希望能够提取其中一个包含特定属性的序列,例如:
[my_image_tag image_id="12345" attr2="..." ...]
从上面的例子中,我想用方括号提取整个事物,但在这种情况下只使用其中一个属性及其值 - image_id="12345"
我尝试使用正则表达式,但它给了我整行,而我只需要基于特定值的部分行,如上所述。
答案 0 :(得分:1)
这样的事情应该有效:
my_string = '<h1>Heading1</h1>some text soem tex some text [some_tag attrs][/some_tag]some text some text [some_tag image_id="12345"] some text'
search_attrs = %w(image_id foo bar)
found = my_string =~ /(\[[^\]]*(#{search_attrs.join('|')})="[^"\]]*"[^\]]*\])/ && $1
# => "[some_tag image_id=\"12345\"]"
对于特定的属性id和值,您可以像这样简化它:
found = my_string =~ /(\[[^\]]* image_id="12345"[^\]]*\])/ && $1
# => "[some_tag image_id=\"12345\"]"
它的工作原理是将主要捕获组扩展到您要查找的所有内容。
但是,这假设您只需要提取一个这样的属性。
它还假设您不关心字符串是否穿过任何HTML标记边界。如果您关心这一点,那么您需要先使用HTML解析器挖出法律边界,然后在这些结果中进行搜索。