2012-02-16 32 views
0

我有諸如本(約1600項,也許2000字)的一個非常大的列表替換從列表中的任何比賽:http://pastebin.com/6XnWBJwMPHP正則表達式:一個字符串列表,搜索一些內容,有一個鏈接

我想要在我的$content中搜索此列表中的條款,並用以下格式中的鏈接替換找到的任何鏈接:<a href="/glossary/firstinitial/term">term</a>如(術語:腹部)<a href="/glossary/a/abdomen">abdomen</a>

這樣做的最有效方法是什麼?

根據this線程,我一直在使用preg_replace_callback,但無法使其正常工作 - 目前它將內容中的每個單詞連接到「/」!正則表達式很差!

由於提前,

回答

1

如果您嘗試更改腹部<a href="/glossary/a/abdomen">abdomen</a>這裏有一個建議:

$terms = 'abdomen|etc|parental care'; 
// this is the string of the terms separated by pipes 

$terms = explode('|',$terms); 
// split terms into an array (aka $terms) 
foreach ($terms as $key => $value) { 
    $terms[$key] = preg_replace('/\s\s*/',' ',strtolower($value)); 
} 
// change each into lowercase and normalize spaces 

$str = 'Here\'s some example sentence using abdomen. Abdomen is a funny word and parental care is important.'; 

foreach ($terms as $term) { 
// this will loop all the terms so it may take a while 
// this looks like a requirement because you have multi-word terms in your list 
    $str = preg_replace('/\b('.$term.')\b/i', '<a href="/glossary/'.$term{0}.'/'.str_replace(' ','%20',$term).'">$1</a>', $str); 
    // regardless of case the link is assigned the lowercase version of the term. 
    // spaces are replaced by %20's 
    // -------------------- 
    // ------- EDIT ------- 
    // -------------------- 
    // added \b's around the term in regex to prevent, e.g. 
    // 'etc' in 'ketchup' from being caught. 
} 

編輯:檢查的最新留言中的代碼。

+0

將更新代碼。我剛剛看到了多詞詞彙。 – inhan 2012-02-16 21:42:47

+0

現在更新它。 – inhan 2012-02-16 22:05:08

+0

這是另一種方法,但這個代碼的問題在於,當您更改'a'標籤的href時,您必須重新編碼preg-replace,而不是使其不是特定於html的那麼多。 – dyoser 2012-02-16 23:44:55

2
// the list of words 
$words = explode("|",$arrayOfWords); 

// iterate the array 
foreach($words as $c=>$v) 
// replace the word in the link with the item of the array 
$line = preg_replace("|<a\w+>(.*)</a>|Usi",$v,$string) 

有是創造了reg和解析它的太多的方法......所有valids。

相關問題