php正则表达式从链接中的rel属性中删除文本

时间:2010-03-05 12:20:50

标签: php regex

有一种非常简单的方法来获取rel属性的文本,即

<a href='#' rel='i want this text here'></a>.

我今天早上尝试使用正则表达式,但没有运气。

5 个答案:

答案 0 :(得分:4)

Do not use regular expressions for irregular languages like HTML.您可以使用XPath实现这一目标。例如:

$doc = new DOMDocument();
$doc->loadHtml($htmlAsString);
$xpath = new DOMXPath($doc);
$nodelist = $xpath->query('//a[@rel]');

答案 1 :(得分:1)

除非HTML是100%静态且由您控制,否则我建议您使用HTML解析器,例如DOMDocumentPHP Simple HTML DOM Parser之类的内置HTML解析器。设置比简单的正则表达式更加努力,但它在所有情况和变化中都会更加可靠。

 <a href='#' rel="i want this text here"></a>
 <a href='#' REL="i want this text here"></a>
 <a rEL='i want this text here' href='#' ></a>

答案 2 :(得分:0)

这应该有效:

preg_match_all('%<a[^>]+rel=("([^"]+)"|\'([^\']+)\')[^>]*>%i', $html, $matches);
print_r($matches);

答案 3 :(得分:0)

正如其他人所说,你应该避免使用正则表达式来解析HTML,因为它不是常规的。但是,如果您确定HTML的结构可以使用正则表达式。以下程序将提取您想要的内容:

<?php
$a = "<a href='#' rel='i want this text here'></a>";

if(preg_match("{<a href.*?rel='(.*?)'.*?>}",$a,$matches)) {
        echo $matches[1]; // prints i want this text here
}
?>

答案 4 :(得分:0)

正如其他海报所指出的那样:使用正则表达式进行html解析真是个坏主意,很多事情都可能出错,你需要做更多的支持。 (见Pekka的评论!)

为了在这里添加一些值,我提供了获取每个rel属性的完整示例:

<?php
$html = "<a href='#' rel='i want this text here'></a>";

$dom = new DomDocument();
$dom->loadHtml($html);

$xpath = new DomXPath($dom);
$refAttributes = $xpath->query("//a[@rel]");
// ^^ This means: Get my every <a...></a> that has a rel attribute

foreach($refAttributes as $refAtt) {
    var_dump($refAtt->getAttribute("rel"));
}

如需额外阅读,可以尝试:

http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html

http://kore-nordmann.de/blog/0081_parse_html_extract_data_from_html.html