检查html是否包含带属性的标记

时间:2013-12-30 08:51:05

标签: php regex html-parsing preg-match

我正在使用正则表达式解析HTML页面,因为它的内容不是有效的HTML(开放标记等)。

我想检查HTML是否包含<span>,其属性为data-valmsg-for="LoginError"。 我尝试使用DOM,但由于HTML无效,它似乎无法找到标记。

我尝试的最新动态是preg_match("/<[^<>]data-valmsg-for=\"LoginError\"[^<>]*>/i", $sHtml); 我的正则表达式技巧几乎不存在,所以我想知道正确的正则表达式应该是什么。


更新 这是html的一个例子

[...]
<span class="field-validation-error" data-valmsg-for="LoginError" data-valmsg-replace="true" id="CodeError">Du har gjort m&#229;nga f&#246;rs&#246;k inom en kort tid. F&#246;rs&#246;k igen senare</span>        <br>
[...]

2 个答案:

答案 0 :(得分:1)

如果您需要检查它,请使用此正则表达式:

$a = "<span></span><span data-valmsg-for=\"LoginError\">test</span><br>";
if (preg_match_all('/<[a-z \'"]*data-valmsg-for/i', $a, $matches)) {
    var_dump($matches);
} else {
    echo 'fail';
}

但是如果你需要从中获取数据,你需要关注

$a = "<span></span><span data-valmsg-for=\"LoginError\">test</span><br>";
if (preg_match_all('/<[a-z \'"]*data-valmsg-for[^>]*>([^<]*)/i', $a, $matches)) {
    var_dump($matches);
} else {
    echo 'fail';
}

编辑:

要检查LoginError的完全匹配,您需要使用以下内容:

$a = "<span></span><span data-valmsg-for=\"LoginError\">test</span><br>";
if (preg_match_all('/<[a-z \'"]*data-valmsg-for=[\'"]LoginError[\'"][^>]*>([^<]*)/i', $a, $matches)) {
    var_dump($matches);
} else {
    echo 'fail';
}

$matches[0]将包含一系列已创建的错误文本(请注意。文本将在没有标签的情况下拍摄)

答案 1 :(得分:0)

以下内容应该有效:

var_dump(preg_match_all('~<span\s.*?data-valmsg-for="~i', $html));

但是domdoc应该可行,这里有一个简单的例子:

$html = <<<HTML
[...]
<span>foo</span>
<span>bar
<span class="field-validation-error" data-valmsg-for="LoginError" data-valmsg-replace="true" id="CodeError">Du har gjort m&#229;nga f&#246;rs&#246;k inom en kort tid. F&#246;rs&#246;k igen senare        <br>
[...]
HTML;


$dom = new DOMDocument();
@$dom->loadHTML($html);
$spans = $dom->getElementsByTagName('span');

$i = 0;
foreach($spans as $span){
  echo ++$i . ' | ' . $span->getAttribute('data-valmsg-for') . '</br>';
}

<强>输出

1 | 
2 | 
3 | LoginError