2010-06-17 11 views
0

可能重複:
RegEx match open tags except XHTML self-contained tags/正則表達式/ HTML的,但不是在形式

我需要做的HTML輸入一些正則表達式替換,但我需要排除一些地方從其他正則表達式過濾。

(例如刪除所有<a>標籤與特定href="example.com…,除了是<form>標籤內的那些)

是否有任何智能正則表達式技術的呢?還是必須使用$regex1找到所有表單,然後將輸入拆分爲較小的塊(不包括匹配的文本塊),然後在所有塊上運行$regex2

+1

在鏈接到Zalgo事情之前。 – MiffTheFox 2010-06-17 18:58:39

+0

@Miff - 很好地完成! – 2010-06-17 18:59:50

+0

@Miff我還沒有看到的着名答案之一;) – takeshin 2010-06-17 19:14:05

回答

1

爲什麼不能把你需要的html字符串轉儲到DOM助手中,然後使用getElementsByTagName('a')來獲取所有錨點並使用getAttribute來獲取href,removeChild來刪除它?

+0

OP可能有一個大的HTML文件進來,整個問題是找到裏面的

標籤。 – 2010-06-17 19:00:13

0
  • 如果表單可以嵌套,那在技術上是不可能的。
  • 如果表單不能嵌套,那實際上是不可能的。有沒有功能,你可以使用相同的正則表達式來
    1. 定義一個區域,其中的匹配應該做的(即外在形式)
    2. 定義的東西進行匹配(即元素)
2

非正則表達式的方法:

<?php 
$html = '<html><body><a href="foo">a <b>bold</b> foz </a> b c <form><a href="foo">l</a></form> <a href="boz">a</a></body></html>'; 
$d = new DOMDocument(); 
$d->loadHTML($html); 
$x = new DOMXPath($d); 
$elements = $x->query('//a[not(ancestor::form) and @href="foo"]'); 
foreach($elements as $elm){ 
     //run if contents of <a> should be visible: 
     while($elm->firstChild){ 
       $elm->parentNode->insertBefore($elm->firstChild,$elm); 
     } 
     //remove a 
     $elm->parentNode->removeChild($elm); 
} 
var_dump($d->saveXML()); 
?> 
相關問題