2014-09-18 144 views
1

我正在使用一個CMS系統,堅持要在</figure><figcaption>標籤之間放置大量垃圾標記&空標籤。preg_replace - 匹配兩個標籤之間的所有內容

我想用正則表達式來匹配&刪除這個垃圾(不幸的是修復CMS是不可能的)。

我似乎已經創建了一個有點太餓的正則表達式,並且也剝離了標籤。

$str = '<p></p><figure class="image"><img title="Screenshot 2014-08-26 16.34.12.png" alt="Screenshot 2014-08-26 16.34.12.png" src="/image/Screenshot%202014-08-26%2016.34.12.png" class="image-style-none" typeof="foaf:Image"></figure><p></p> 
    <p>Â&nbsp;</p> 
    <p></p><figcaption>Screenshot 2014-08-26 16.34.12.png</figcaption><p></p> 
    <p> </p> 
    <p> </p> 
    <p></p>'; 

preg_replace('#(</figure>).*?(<figcaption>)#s', '[replace-me]', $str); 

任何人都可以指向正確的方向嗎?

+0

這可能太餓了,因爲你沒有使用匹配的標籤:'

'與'
'一起。最好使用這些標籤,然後只需使用這些標籤即可替換它們。 – 2014-09-18 21:45:40

+0

預期的結果是作爲來源,除了關閉

和之間的所有標記/標記應替換爲[replace-me] – steve 2014-09-18 21:47:55

+2

HTML不是正則表達式可解析語言。 [*不要在HTML上使用正則表達式。只是不。*](http://stackoverflow.com/a/1732454/237955) – amphetamachine 2014-09-18 21:49:25

回答

2
preg_replace('#(?<=<\/figure>)(.*?)(?=<figcaption>)#ms', '[replace-me]', $str)); 

不正則表達式只是很有趣!

+1

謝謝 - 這只是我需要的。其他答案也都是有效的,但這首先是爲了回答我的需要。 – steve 2014-09-18 22:08:48

+1

(Upvoted其他人也儘管 - 非常感謝幫助) – steve 2014-09-18 22:09:14

1

您可以使用正則表達式來刪除任何僅包含空格,不間斷空格和非ascii字符的<p>標記,例如

$str = preg_replace('/<p>(\\s|&nbsp;|[\x80-\xFF])*<\/p>/i', '', $str); 

儘管在這種情況下可行,但通常使用正則表達式來修改HTML。

1

你可以對你的正則表達式進行一些調整。

(?<=</figure>).*?(?=<figcaption>) 

Working demo

enter image description here

您可以使用正則表達式以上只匹配內容,並與一個空字符串替換它。看看上面的替代部分。

的想法是使用正則表達式環視那些標籤之間的內容相匹配,但不包括標籤

1
function getNodeContent($name, $buffer) { 
    $matches = array(); 
    preg_match_all("/<" . $name . "[\w\s]*[^>]*>(.*?)<\/" . $name . ">/", $buffer, $matches); 
    return isset($matches[1]) ? $matches[1] : ''; 
} 

echo "<pre>"; 
var_dump(getNodeContent('figure', $str)); 
var_dump(getNodeContent('figcaption', $str)); 
echo "</pre>"; 
die(); 
1

在替換字符串中使用回部分引用括號:

preg_replace('#(</figure>).*?(<figcaption>)#s', '$1$2', $str); 
相關問題