2014-07-24 11 views
-1

我需要一些特殊的過濾某些文本都在我的網站上,象下面這樣:簡單的str_replace()函數做的事情錯了 - WordPress的

function special_text($content) { 
    $search_for = 'specialtext'; 
    $replace_with = '<span class="special-text"><strong>special</strong>text</span>'; 
    return str_replace($search_for, $replace_with, $content); 
}  
add_filter('the_content', 'special_text', 99); 

它做的事情在一個很好的方式,但是...

的內容如果有任何鏈接,如:<a title="specialtext" href="http://specialtext.com">specialtext</a>,則標題和href文本也發生更改,並且鏈接斷開。

我該如何在那裏做例外?

有沒有一種方法,我可以把一些例外數組和str_replace()只是跳過他們?

+0

您可能會考慮使用[DOM解析器](https://www.google.com/webhp?#q=php+dom+parser)來實現此類功能。 –

+0

是被其他任何東西包裹的「特殊文字」嗎?還是僅僅是文本字符串? – magnified

回答

2

您應該使用正則表達式,並使用功能preg_replace()更換匹配的字符串。以下是您的special_text()函數的完整實現。

function special_text($content) { 
    $search_for = 'specialtext'; 
    $replace_with = '<span class="special-text"><strong>special</strong>text</span>'; 
    return preg_replace('/<a.*?>(*SKIP)(*F)|'.$search_for.'/m', $replace_with, $content); 
} 

在下面的正則表達式首先,使用<a.*?> - <a...>之間一切都匹配,並且使用(*SKIP)(*F)|它被跳過,然後從別的$search_for匹配(在你的情況下,它是specialtext)。

+0

我可能沒有正確測試它,但這似乎並不能取代'a'標籤之間的'specialtext'。 OP似乎只希望保留文本,如果它是標記屬性的一部分。測試[這裏](http://sandbox.onlinephpfunctions.com/code/d765cf463617549493fb2a278f09e197df5a110b)。 –

+0

Thanks @PatrickQ我誤解了這部分內容。現在它應該可以正常工作。 –

+0

@MarcinNabiałek:謝謝。但是我忘了提到這一點,我的項目文件夾也有我的文本這樣的名稱,即'specialtext'。所以絕對路徑也包含字符串。它不會跳過'',因此圖像被破壞。 :( - (但對於錨標記它工作得很好。) –

0

如果您只想更改a標籤之間的文本,則正則表達式可以創造奇蹟。

這裏是東西時,我從發送到我的電子郵件中提取數據我用:

​​

返回「SPECIALTEXT」

如果有空白,它也會返回「SPECIALTEXT測試」。

正則表達式肯定是要走的路。

$subject = "abcdef"; 
$pattern = '/^def/'; 
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3); 
print_r($matches); 
?> 

Source

,然後做對返回匹配的替代。

+0

查看一些[這個問題]的答案(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/)作爲參考爲什麼正則表達式是_rarely_你想用來解析HTML。 –

+0

「有時候適合解析一組有限的,已知的HTML。」 如果Mayeenul只是替換超鏈接之間的文本,那麼這屬於「有限,已知設置...」的帶。 –

+0

是的,但是如果沒有明確說明需要什麼,我不認爲這是一個安全的假設。特別是「......遍佈我的網站......」 –

1

Jezzabeanz完全得到它,除非你可以仍然把它簡化:

return preg_replace("/^def/", $replace_with, $content); 
+0

非常真實,不錯的一個法裏德。 –