2015-02-23 38 views
0

我需要一個正則表達式去除字符串中的外部/頂級HTML標記,但保留內部的一個。正則表達式去除字符串中的外部HTML標記

$str = "<div>Start <br /> <span>test</span> end.</div>"; 

進入

$str = "Start <br /> <span>test</span> end."; 

除了

$str = "<aside id="main" class="one">Start <br /> <span>test</span> end.</aside>"; 

進入

$str = "Start <br /> <span>test</span> end."; 

preg_replace('/<[^>]*>/', '', $str); 

刪除所有標籤不僅僅是外部標籤。

+8

最好使用[DOM](http://www.php.net/manual/en/book.dom.php)比哈克正則表達式 – 2015-02-23 09:52:08

+0

DOM不能選擇標籤的內容而不剝離標籤中的內容。 但是,它可以選擇整個標籤,其內容類似於'

bla
bla
',現在我只需要去掉實際的外部標籤(在這種情況下爲div)並將標籤內容保留。 – 2015-02-23 17:02:30

+1

'$ html = $ domElement-> ownerDocument-> saveHTML($ domElement);'應該在$ html中返回Dom節點的內容而不剝離其中的標籤 – 2015-02-23 17:07:20

回答

0

這個基本的正則表達式可能會做。但是,它不包含具有包含>的屬性的標籤,因此會跳閘。

Find: <[^>]*>([\s\S]*)<\/[^>]*> 
Replace: $1 

如果您期望屬性可能包含標籤括號,則會變得更加複雜。

Find: <(?:[^>]*?(?:(?:"[^"]*?"|'[^']*?')+[^>]*?)|[\s\S]*?)>([\s\S]*)<\/[^>]*> 
Replace: $1 

任何一個人都應該這樣做。

+0

在第一個正則表達式中出現錯誤'警告:preg_replace():未知修飾符']''。 – 2015-02-23 12:58:41

+0

@RomanToasov嘗試轉義正斜槓。'<[^>] *>([\ s \ S] *)<\/[^>] *>' – 2015-02-23 17:56:41

0

如何利用DOM元素,並模擬innerHTML()

$html = '<html><body><div><ul><li>1</li><li>2</li><li>3</li></ul></div></body></html>'; 

function DOMinnerHTML(DOMNode $element) { 
    $innerHTML = ""; 
    foreach ($element->childNodes as $child) { 
     $innerHTML .= $element->ownerDocument->saveHTML($child); 
    } 

    return $innerHTML; 
} 

$doc = new DOMDocument(); 
$doc->loadHTML($html); 

foreach ($doc->getElementsByTagName('ul') as $child) { 
    $html = DOMinnerHTML($child); 
    echo $html, PHP_EOL; 
} 

,而不必訴諸於正則表達式

1

請注意

使用正則表達式是不修改HTML的最佳方式碼! 在大多數情況下,使用DOMDocument或DOMDocumentFragement對象修改或提取HTML代碼中的數據會更好也更可靠。

不過,也有有效的方案,其中一個正則表達式是更好的,主要是當這些因素適用:

  • 你知道你的編輯會在HTML代碼是有效的。
  • 被修改的HTML結構在所有情況下都是相同的。
  • 您只對代碼做了非常簡單的更改。
  • 性能很重要(例如,當它在循環內執行時)。 DOMDocument比簡單的正則表達式慢得多!

代碼

要從一些HTML代碼使用剝離最外面的標記此正則表達式:

/* Note: 
* The code must start with an opening tag and end with a closing tag. 
* No white space or other text must be present before the first 
* tag/after the last tag, else you get some unexpected results. 
*/ 

$contents = preg_replace('/^<[^>]+>|<\/[^>]+>$/', '', $markup); 
      // ^<[^>]+>  This removes the first tag 
      // <\/[^>]+>$ This removes the last closing tag 

實例

此正則表達式適用於大多數HTML標記例如

In: '<div class="my-text" id="text" style="color:red">some text</div>' 
Out: 'some text' (expected result) 

當第一個標籤包含「>」字符時,它將打破一切,例如,

In: '<div title="Home > Archives">Archive overview</div>' 
Out: ' Archives">Archive overview' (unexpected result) 

另外,在開始或結束空白/文本將打破正則表達式

In: '<div>Your name</div>:' 
Out: 'Your name</div>:' (unexpected result) 

當然,任何標籤將被剝離,而沒有任何完整性檢查,例如

In: '<h2>Settings</h2><label>Page Title</label>' 
Out: 'Settings</h2><label>Page Title' (unexpected result) 
0

我做了一個函數,隨着它們的內容刪除HTML標籤:

功能:

<?php 
function strip_tags_content($text, $tags = '', $invert = FALSE) { 

    preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags); 
    $tags = array_unique($tags[1]); 

    if(is_array($tags) AND count($tags) > 0) { 
    if($invert == FALSE) { 
     return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text); 
    } 
    else { 
     return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text); 
    } 
    } 
    elseif($invert == FALSE) { 
    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text); 
    } 
    return $text; 
} 
?> 

示例文本: $文字= '樣品文本與標籤';

結果爲用strip_tags($文本):與標籤 示例文本

結果爲strip_tags_content($文本): 文字與

結果爲strip_tags_content($文本, ''): 樣本 text with

strip_tags_content($ text,'',TRUE);的結果 文本與標籤

我希望有人是有用的:)

相關問題