2013-04-21 142 views
9

我有一个html字符串,其中只包含一个元素。例如:用php修改html属性

<a href="http://www.test.com" rel="nofollow external">test</a> 

在PHP一定要考,如果相对包含外部,如果是,则修改HREF和保存的字符串。

我查找了DOM节点和对象。但它们对于只有一个A元素似乎太多了,因为我必须迭代以获得html节点,并且我不确定如何测试是否存在并包含外部

$html = new DOMDocument(); 
$html->loadHtml($txt); 
$a = $html->getElementsByTagName('a'); 
$attr = $a->item(0)->attributes(); 
... 

在这一点上,我将获得NodeMapList似乎是开销。有没有更简单的方法呢,还是应该用DOM来完成?

+0

当DOM处理,你有两种选择:1)使用本地DOM解析器2)使用正则表达式(这是开销) – Yang 2013-04-21 01:47:28

+0

继续前进。使用'DOMDocument()'进行操作 – Yang 2013-04-21 01:48:10

+0

没有人应该使用原始DOM方法进行操作。考虑phpQuery或QueryPath等,以减少繁琐的样板。 – mario 2013-04-21 01:48:32

回答

9

有没有更简单的方法,或者我应该使用DOM?

用DOM做。

下面是一个例子:

<?php 
$html = '<a href="http://example.com" rel="nofollow external">test</a>'; 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
$nodes = $xpath->query("//a[contains(concat(' ', normalize-space(@rel), ' '), ' external ')]"); 
foreach($nodes as $node) { 
    $node->setAttribute('href', 'http://example.org'); 
} 
echo $dom->saveHTML(); 
0

对你来说更容易(如jQuery JavaScript的),你可以使用正则表达式像 if it matches /\s+rel\s*=\s*".*external.*"/ 然后做一个正则表达式替换像 /(<a.*href\s*=\s*")([^"]\)("[^>]*>)/\1[your new href here]\3/

虽然使用可以做这样的东西一库

2

我一直在用DOM修改。这是我得到的:

$html = new DOMDocument(); 
$html->loadHtml('<?xml encoding="utf-8" ?>' . $txt); 
$nodes = $html->getElementsByTagName('a'); 
foreach ($nodes as $node) { 
    foreach ($node->attributes as $att) { 
     if ($att->name == 'rel') { 
      if (strpos($att->value, 'external')) { 
       $node->setAttribute('href','modified_url_goes_here'); 
      } 
     } 
    } 
} 
$txt = $html->saveHTML(); 

我不想为这一个字符串加载任何其他库。

2

最好的办法是使用HTML解析器/ DOM,但这里有一个正则表达式的解决方案:

$html = '<a href="http://www.test.com" rel="nofollow external">test</a><br> 
<p> Some text</p> 
<a href="http://test.com">test2</a><br> 
<a rel="external">test3</a> <-- This won\'t work since there is no href in it. 
'; 

$new = preg_replace_callback('/<a.+?rel\s*=\s*"([^"]*)"[^>]*>/i', function($m){ 
    if(strpos($m[1], 'external') !== false){ 
     $m[0] = preg_replace('/href\s*=\s*(("[^"]*")|(\'[^\']*\'))/i', 'href="http://example.com"', $m[0]); 
    } 
    return $m[0]; 
}, $html); 

echo $new; 

Online demo