用于在html中搜索的正则表达式

时间:2013-10-21 08:17:11

标签: java html regex

我正在尝试编写正确的正则表达式来搜索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

7 个答案:

答案 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=\\\"(.*?)\\\""的结果字符串中查找值

感谢大家的帮助