我正在尝试编写正确的正则表达式来搜索html中的值,但是有一些问题。
有一段html:
<div class="inner">
<div class="title">Processing 3-D Secure Transaction</div>
<form autocomplete="off" name="PAResForm" id="PAResForm" action="https://www.alfaportal.ru/" method="POST">
<input name="MD" type="hidden" value="4326381105C3B67B2823E71FD235FFD2"><input value="eJzVWFmvo0iy/iulnkerm9UYt1xdQtJ2pkQdOVw5AW2qGv+is66Q
qrz9LBZ3mCe7mJzYARdloC1dJ/Lk+nQ7KBxxdgtIEgy/Tp/I93MZ5NtZzfdTnPdj5vfz7tex6I/n
4P8DRkGf4Q==" name="PaRes" type="hidden">
我正在尝试搜索字符串
<input name="MD" type="hidden" value="4326381105C3B67B2823E71FD235FFD2">
获得价值
问题是价值和名称可以互相替换 例如
<input value="4326381105C3B67B2823E71FD235FFD2" type="hidden" name="MD">
我写了正则表达式:
<input.*name=\"MD\"|value=\"([^<>]*?)\"[^<>]*value=\"([^<>]*?)\"|name=\"MD\".*?>
它适用于某些在线正则表达式服务,但在真正的java中不起作用。
请帮助我们正确修改它。
我也编写了简单的命令行工具来测试它。 http://pastebin.com/Pzynqrn8
答案 0 :(得分:2)
我想尝试这样的事情:
<input\s*?(value=['"].*?['"]\s*)|(type=['"].*?["']\s*)|(name=['"].*?['"]\s*)\>
答案 1 :(得分:2)
HTML解析有很多工具。我想你不应该忽视它们。 讨论了here。
答案 2 :(得分:2)
我不知道如何在Java中这样做,但我强烈建议使用适当的文档对象模型工具等。
在PHP中,我会这样做:
$xml = new DomDocument();
$xml->loadXml($yourHTMLHere);
$xpath = new DOMXPath($xml);
$node = $xpath
->evaluate('//form[@name="PAResForm"]//input[@name="MD"]')
->item(0);
$yourValueIsHere = $node->getAttribute('value');
5行,完全可读,并不关心属性顺序。 Java可以肯定地做同样的事情,只需搜索适当的类。
do not parse irregular language with regural expressions。 Html不是常规语言。
答案 3 :(得分:1)
我会在这样的模式中使用前瞻:
<input(?=[^>]+?name="MD")[^>]+?value="([A-Z0-9]+)"
您基本上是说您正在寻找<input>
MD 的name
元素。这是前瞻:(?=[^>]+?name="MD")
),它不消耗任何字符,但确保您的name
属性存在。然后,您只需匹配第一个捕获组中value
的值:([A-Z0-9]+)
。
在free spacing mode中编写模式可能会有所帮助:
<input # opening input tag
(?=[^>]+?name="MD") # lookahead looking for the presence of the name attribute
[^>]+? # anything (whitespace, other attributes) up to ...
value="([A-Z0-9]+)" # the value attribute and its value
[更新] 请注意,使用适当的HTML解析器解析HTML几乎总是更好 - 这就是他们的好处。在这种情况下,在我看来,使用正则表达式是好的。请记住下一个必须维护代码并做出负责任决定的人。
答案 4 :(得分:1)
与往常一样,总是在处理HTML时总是:使用解析器。由于技术原因在well-known post解释为死亡,正则表达不能胜任这项任务。
Java有jSoup,创建一个小而简单且可维护的代码片段非常容易,它可以完全满足你的需要。
Document doc = Jsoup.parse(str);
Element input = doc.select("input[name='MD']").first();
if (input != null) {
String value = input.attr("value");
// now do something with it
}
现在将这个三线笔与所有那些毛茸茸的正则表达式的答案进行比较,想想它们是多么难以维护和不安全,它们需要多少解释以及如何在HTML更改时从头开始完全重写它们。算一下你试图为自己找到解决方案的时间,并确定正则表达式在HTML方面是否值得。
答案 5 :(得分:0)
只要你的元素具有这些属性,它就不难:
public static void main(String[] args) {
Pattern p = Pattern.compile("<input(?:\\s+|name=\"MD\"|type=\"hidden\"|value=\"([^\"]+)\")+");
Matcher m = p.matcher("<input name=\"MD\" type=\"hidden\" value=\"4326381105C3B67B2823E71FD235FFD2\">");
if (m.find()) {
System.out.println(m.group(1));
}
}
答案 6 :(得分:-1)
最后,我通过添加另一个模式解决了这个问题。我首先按模式<input ... name='MD' ... />
查找".*?(<input[^<>]*name=\\\"MD\\\"[^<>]*>).*?"
之类的字符串,之后我在模式".*?value=\\\"(.*?)\\\""
的结果字符串中查找值
感谢大家的帮助