2013-04-21 69 views
9

Tôi có chuỗi html chứa chính xác một phần tử trong đó. Ví dụ:Sửa đổi thuộc tính html với php

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

Trong php Tôi phải kiểm tra nếu rel chứa bên ngoài và nếu có, sau đó sửa đổi href và lưu chuỗi.

Tôi đã tìm các nút và đối tượng DOM. Nhưng chúng dường như quá nhiều đối với chỉ một phần tử A, vì tôi phải lặp lại để nhận các nút html và tôi không chắc chắn cách kiểm tra nếu rel tồn tại và chứa bên ngoài.

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

Tại thời điểm này, tôi sẽ nhận được NodeMapList dường như ở trên cao. Có cách nào đơn giản hơn cho điều này hay tôi nên làm điều đó với DOM?

+0

Khi giao dịch với DOM bạn có hai lựa chọn: 1) sử dụng có nguồn gốc DOM phân tích cú pháp 2) Sử dụng biểu thức chính quy (đó là overhead) – Yang

+0

Tiếp tục đi. Sử dụng 'DOMDocument()' để thao tác – Yang

+0

Không ai nên sử dụng các phương thức DOM thô để thao tác. Hãy xem xét phpQuery hoặc QueryPath, vv để giảm bớt boilerplate tẻ nhạt. – mario

Trả lời

9

Có cách nào đơn giản hơn cho điều này hoặc tôi nên làm điều đó với DOM không?

Làm điều đó bằng DOM.

Dưới đây là một ví dụ:

<?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

Bạn có thể sử dụng một biểu thức chính quy như if it matches /\s+rel\s*=\s*".*external.*"/ sau đó làm một RegExp thay thế như /(<a.*href\s*=\s*")([^"]\)("[^>]*>)/\1[your new href here]\3/

Mặc dù sử dụng một thư viện mà có thể làm loại công cụ này cho bạn dễ dàng hơn nhiều (như jquery cho javascript)

2

Tôi tiếp tục sửa đổi với DOM. Đây là những gì tôi nhận được:

$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(); 

Tôi không muốn tải bất kỳ thư viện nào khác cho chỉ một chuỗi này.

2

Cách tốt nhất là sử dụng một phân tích cú pháp HTML/DOM, nhưng đây là một giải pháp regex:

$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.

Các vấn đề liên quan