我正在使用正则表达式解析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ånga försök inom en kort tid. Försök igen senare</span> <br>
[...]
答案 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ånga försök inom en kort tid. Försö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