我正在尝试从“img”标记的结尾和关闭“a”标记之间获取字符串(您好,我来自img标记之后)来自下面一行。
<a href="products.html><img src="image.jpg" alt="alt value">hello i am from after img tag</a>
然后检查它们是否匹配。同时我想找出那条线的数量。 我尝试了下面的代码,它给出了行号和网页行。
$dom = new domDocument;
$dom->loadHTMLFile('http://www.google.com');
$dom->preserveWhiteSpace = true;
$dom->formatOutput = true;
$new = htmlspecialchars($dom->saveHTML(), ENT_QUOTES);
$lines = preg_split('/\r\n|\r|\n/', $new);
foreach ($lines as $lineNumber => $line) {
echo $lineNumber . \r\r. $line;
}
以下代码为我提供了图像源和alt标记。我无法获得“img”标签结束和关闭“a”标签之间的行号或文本(你好我来自img标签)。
$alts = array();
$tags = $dom->getElementsByTagName('img');
foreach($tags as $tag) {
$alts[$tag->attributes->getNamedItem('src')->nodeValue]
= $tag->attributes->getNamedItem('alt')->nodeValue;
}
foreach($alts as $key => $alt) {
echo "{$key} => {$alt}<br/>";
}
我知道regexp不适用于html解析,但我也试过看看它是否适用于以下行。 $ alt ='你好,我来自img 标签' 我有的正则表达式是, // alt里面的任何东西
preg_match_all('|\s*alt[^>]*=[\'"](.*?)[\'"]|i', $alt, $altTag);
//“img”标记结尾和结束“a”标记之间的任何内容。
preg_match_all("#<\s*a[^>]*><\s*img[^>]*>(.*?)<\s*/\s*a>#s", $alt, $foo);
它的工作方式非常完美,但是当尝试在变量$ line上使用相同的regExp(来自上面的代码)时,它并没有给我任何东西。 谁能帮帮我吗。我真的需要做这个工作。谢谢
答案 0 :(得分:2)
在你的情况下使用Regexp不是一个好主意,但如果你真的想使用它,那么你需要改变你的foreach循环。这是代码。
foreach ($lines as $lineNumber => $l){
$line= html_entity_decode($l);
}
现在您可以应用regExp来查找您想要的内容。
答案 1 :(得分:1)
试试吧
$str = '<a href="products.html><img src="image.jpg" alt="alt value">hello i am from after img tag</a>';
preg_match_all('#<a[^>]+>(.*)</a>#isU', $str, $match);
$result = array_map('strip_tags', $match[1]);
print_r($result);