2017-10-04 106 views
0

我想創建一個正則表達式模式,它捕獲一個字符串中的自閉合html標籤中的所有內容,它將用於一個php preg_replace中,用於刪除所有自閉標籤(通常不是selfclosing,即分區,跨度等)從一個HTML DOM字符串。匹配範圍沒有一個字符與正則表達式

下面是一個例子。在字符串:

'<div id="someId><div class="someClass" /></div>' 

我想拿到賽:

'<div class="someClass" />' 

,但我一直沒有得到任何比賽在全部或本場比賽:

'<div id="someId><div class="someClass" />' 

我曾嘗試以下正則表達式模式和它們的各種組合

一個簡單的正則表達式模式的點通配符,不包括「>」 :

~<div.*?[^>].*?.*?/>~ 

負前瞻正則表達式:

~<div(?!.*?>.*?)/>~ 

負回顧後發正則表達式:

~<div.*?(?<!>).*?/>~ 

我缺少什麼?

+0

''

.*?
是 –

+0

只是一個例子,這是我應該已經瞭解更加清晰。我已經更新了這個問題。 –

回答

1

使用解析器的方法代替:

<?php 

$html = <<<DATA 
<div id="someId"> 
    <div class="someClass" /> 
</div> 
DATA; 

$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DomXPath($dom); 

$divs = $xpath->query("//div[@class='someClass']"); 
foreach ($divs as $div) { 
    // do sth. useful here 
} 

?> 

這將把DOM並查找div的問題(通過XPath表達式)。

+0

以上只是一個例子,我應該更清楚一點。但是我沒有意識到你在上面提到的PHP中的那些DOM功能,所以謝謝:) –

0

我似乎不必要地複雜化了答案:

在我的例子,這將產生正確的結果:

~<div[^>]+?/>~ 
如果需要「格」可以被捕獲組所取代,包括額外的標記

0

使用正則表達式如下:

<div[^<]*\/> 

這正則表達式只是CHEC ks表示自閉標籤內沒有<。如果在標籤內部使用<(例如,在一個字符串中),這將會成爲問題。

要excluce <在字符串中:以上

<div(?:[^<]*["'][^"']*["'][^<]*)\/> 
相關問題