2012-01-17 54 views
1

使用PHP我需要我將有一個tag name => tag URL數組我需要以某種方式掃描文本輸入(將有點大,博客文章),並找到文本中的所有標籤名稱並將其替換與URL鏈接。儘管如此,如果標籤名稱在<h1><h2><code> and <pre>標籤內,它將不會執行它。可能爲了簡化起見,我可以說它必須位於<p>標記內才能進行切換。針在乾草堆中的數組在PHP中

我不知道如何做到這一點,我知道我需要正則表達式,但我有點此刻失去了,如果有人可以幫助我一些我將不勝感激

所以PHP標籤會變成<a href="link here">PHP</a>

+0

你是如何得出結論使用正則表達式呢?與您之前的問題之一相關:http://stackoverflow.com/questions/5628783/extract-data-from-a-google-chrome-bookmarks-export-with-php – mario 2012-01-17 00:33:50

回答

3

您可以像使用XML解析器:

$array_of_tags = (array) simplexml_load_string($html); 

OR

$xml_object = simplexml_load_string($html); 

第一種方法會給你標籤一個可搜索的數組。第二個會給你一個SimpleXMLElement對象。

然後,您可以使用一個簡單的foreach循環遍歷數組中的元素或引用SimpleXMLElement對象中的變量。看看W3C的simplexml_load_string教程,它非常簡單。

+1

我認爲這是要走的路,也許與rdlowrey的回答 – JasonDavis 2012-01-17 00:43:02

+1

Yeh完全一致。一旦你有你的數組,你可以使用foreach迭代它... – travega 2012-01-17 00:44:06

+2

+1,因爲DOM是**總是**解析/編輯(X)HTML標記的首選方法。然而,如果有人正在尋找一個簡單的解決方案,並且即使是基本的循環或正則表達式也不舒服,這可能是一個很大的問題。另外,如果需要替換,我會在SimpleXML上推薦DOM,因爲SimpleXML針對讀取和迭代進行了優化,而不是DOM操作。 – rdlowrey 2012-01-17 00:46:41

1

我不會使用正則表達式(我不認爲你能夠),但我認爲你只需要在這個問題上下定決心。做一個foreach循環,讓布爾人跟蹤你在<h1> <h2> <code> or <pre>裏面的時間,如果你正在尋找需要替換的東西,那麼不要替換它,否則請替換它。那有意義嗎?如果你願意,我可以得到更詳細的信息。但旅行者的答案是最好的。

1

一個簡單的循環就足夠了這裏:

$post = 'My link to {tag1} is awesome, but not as awesome as my link to {tag2}'; 

$tags = array(
    'tag1' => 'http://tag1.com', 
    'tag2' => 'http://tag2.com', 
    'tag3' => 'http://tag3.com', 
); 

foreach ($tags as $tag_name => $tag_val) { 
    $post = str_replace('{'.$tag_name.'}', "<a href='$tag_val'>$tag_name</a>", $post); 
} 

echo $post; 
// outputs: 
// My link to <a href='http://tag1.com'>tag1</a> is awesome, but not as awesome as my link to <a href='http://tag2.com'>tag2</a> 
+0

這並不排除h1,h2內的標籤,代碼和預標籤 – Kristian 2012-01-17 00:38:18

+0

@kristian你是對的,但它是一種黑客,因爲它尋找的是{tag1}而不是'tag',所以在其他標籤中你不會做{tag1} '方法 – JasonDavis 2012-01-17 00:40:40

+0

對不起,沒有注意到.. – Kristian 2012-01-17 00:44:52

1

我猜你排除H1,H2,代碼和預標籤沒有嵌套,如果你解析上插入的話,我會做:

  1. preg_replace_callback<(h1|h2|code|pre)>(.*?)</\1>,用佔位符代替它們,並stroing他們到陣列placeholder => html code
  2. strtr更換標籤
  3. strtr與原始的代碼替換的佔位符

Definetly不是一個輝煌的解決方案,但這樣做只在插入帖子,這應該不是那麼糟糕..