2016-04-28 86 views
1

我正在爲網站的詞彙表auto-tooltip功能。這將允許管理員使用相應的定義輸入詞彙表詞匯,然後這些詞彙會在前端出現的任何地方變爲可靠的工具提示觸發器。PHP:查找子字符串,包裝在具有動態屬性的標籤中

下面是我使用的方法:

的所有內容輸出之前,通過與術語詞彙表正則表達式搜索和帶班,然後由拿起包裝他們的標籤的功能過濾JavaScript來處理工具提示的懸停顯示。

我需要做的事,而且不能弄清楚的是,還包括適當的定義作爲跨度上的標題屬性。

這是到目前爲止我的代碼:(初始陣列只是一個例子,也有各自更多的條目)

function glossary_highlight($content) { 
    $glossary = ['Lorem', 'Ipsum']; 
    $definitions = ['Lorem is a type of crocodile', 'Ipsum is a kitchen utensil']; 
    $patterns = []; 
    foreach ($glossary as $term) { 
     $patterns[] = '/\b' . $term . '\b/i'; 
    } 
    $wrapper = '<span class="tooltip" title="XXXX">$0</span>'; 
    $wrapped = preg_replace($patterns, $wrapper, $content); 
    return $wrapped; 
} 

我需要XXXX與在相應的條目被替換$ definitions數組。我無法在foreach循環中執行正則表達式,因爲如果定義中包含其他詞彙表術語等,它可能會在其他跨度的標題內添加跨度。

所需效果 - 給出「Lorem」的$內容存有悲坐阿梅特」,從這個函數返回的應該是:

<span class="tooltip" title="Lorem is a type of crocodile">Lorem</span> <span class="tooltip" title="Ipsum is a kitchen utensil">ipsum</span> dolor sit amet 

我的第一個傾向是做這樣的事情:

$wrapper = '<span class="tooltip" title="' . $definitions[$key] . '">$0</span>'; 

其中$關鍵是相對於詞彙表項的索引有問題,但我無法弄清楚如何w ork那成爲foreach。

如果我不能在PHP中想到這一切,我想我只會應用工具提示跨度並將定義數組發送到javascript以追加標題屬性,但我寧願不將基本任務兩種語言...

我確定這裏有一個完全簡單的答案,但我的大腦不會看到它!誰能幫忙?

編輯:感謝螢科對他的幫助下面的代碼的工作原理如下:

function glossary_highlight($content) { 
    $glossary = ['Lorem', 'Ipsum']; 
    $definitions = ['Lorem is a type of crocodile', 'Ipsum is a kitchen utensil']; 
    $patterns = []; 
    foreach ($glossary as $term) { 
     $patterns[] = '/\b' . $term . '\b/i'; 
    } 
    $wrappers = []; 
    foreach ($definitions as $definition) { 
     $wrappers[] = '<span class="tooltip" title="' . $definition . '">$0</span>'; 
    } 
    $wrapped = preg_replace($patterns, $wrappers, $content); 
    return $wrapped; 
} 
+0

展示示範'$ content' – RomanPerekhrest

+0

只是擡起頭來,我覺得你的代碼可以在一些愚蠢的行爲情況:即包含文字,特別是複數的文字。如果術語中有「馬」,則「馬」將被標記爲「馬」。如果序列在術語表中,「結果」將被標記爲「con sequence」。 –

+0

謝謝,我已經更新了正則表達式來使用單詞邊界來規避這一點。 – Sark

回答

0

我看到兩個選項:

  1. 運行的preg_replace一次,每學期。如果文本很長,許多和這個術語都是實時完成的,這可能會成爲一個性能問題。
  2. 正如您對模式所做的那樣提供一組替換。

我認爲2號通常會更快,而且仍然很簡單。這個想法是建立包裝,像這樣:

$wrappers = []; 
foreach ($definitions as $definition) { 
    $wrappers[] = '<span class="tooltip" title="' . $definition . '">$0</span>'; 
} 

...然後使用包裝:

$wrapped = preg_replace($patterns, $wrappers, $content); 
+1

是的!這是完全意義上的。謝謝你x100000 !!!! – Sark

0

我將你的令牌存儲在一個關聯數組。它只是更乾淨,更容易看到比賽。

$words = [ 
    'lorem' => 'Lorem is a type of crocodile', 
    'ipsum' => 'Ipsum is a kitchen utensil', 
]; 

然後構建模式。請注意在這裏使用\ b字邊界錨,以便我們匹配lorem而不是splorems。

$patterns = []; 
foreach (array_keys($words) as $word) { 
    $patterns[] = '/\b' . $word . '\b/i'; 
} 

然後使用preg_replace_callback()來實時生成自定義替換字符串:

$newContent = preg_replace_callback($patterns, function ($matches) use ($words) { 
    return 
     '<span class="tooltip" title="' . 
     $words[strtolower($matches[0])] . 
     '">' . $matches[0] . '</span>'; 
}, $content); 
+0

謝謝,這也有幫助。你是對的,關聯數組更好。感謝您向我展示這一更好的技術。 – Sark

相關問題