2013-07-07 2 views
1

Я пытаюсь создать простую функцию для поиска слова в строке и связать его. Проблема в том, что иногда слово имеет точку или запятую в конце ее, и я хотел бы ее сохранить. поэтому text word. должен измениться на text <a href="#">word</a>., а не на text <a href="#">word</a>PHP preg_replace с сохранением соответствия не работает

Это моя функция до сих пор. Я не понимаю, почему он не работает:

$string = "words are plenty in the world. another world and another world,comma."; 

function findWord ($string, $word, $link) { 
    $patt = "/(?:^|[^a-zA-Z])(" . preg_quote($word, '/') . ")(?:$|[^a-zA-Z])/i"; 
    return preg_replace($patt, ' <a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string); 
} 

echo findWord ($string, "world", "#"); 

ответ

1

Вы использовали, не захватывая группам (?:...), чтобы соответствовать символы, которые, возможно, окружают искомое слово, но затем использовать $3, как если бы они были захватывая группы (...).

Следовательно, $3 всегда будет пустым. Вы можете либо использовать захват группы вместо:

function findWord ($string, $word, $link) { 
    $patt = "/(^|[^a-zA-Z])(" . preg_quote($word, '/') . ")($|[^a-zA-Z])/i"; 
    return preg_replace($patt, '$1<a href="'.$link.'" class="glossary-item">'.$word.'</a>$3', $string); 
} 

(но не забудьте также заменить $1 в строке!) Или использовать negative lookaround assertions:

function findWord ($string, $word, $link) { 
    $patt = "/(?<![a-zA-Z])(" . preg_quote($word, '/') . ")(?![a-zA-Z])/i"; 
    return preg_replace($patt, '<a href="'.$link.'" class="glossary-item">'.$word.'</a>', $string); 
} 

Я предпочитаю последний.

+0

получил это! благодаря! –

+0

Только один вопрос. Могло ли это (модификатор границ слов) также использоваться в этом случае: return preg_replace ("% \ b $ word \ b% i", ''.$word.'', $ string); ? – sinisake

+1

@nevermind: Да, но это будет работать по-другому. Например, текущее регулярное выражение будет извлекать 'abc' из' _abc1', который не будет иметь регулярное выражение со слоями. –

Смежные вопросы