У меня есть массив со словами как
$arr = array("go", "walk", ...)
Я хотел бы заменить эти слова ссылками f, они подобраны в предложениях. Но это должно быть, только если они соответствуют точно (например, "обход" должен соответствовать "Обходу" или "обходу!" но не также "обход")
И замена должна быть простой ссылкой как: < a href='#walk' >walk< /a >
Кто-либо Какая-либо идея?
Ваши примеры достаточно специфичны, поэтому трудно точно знать, что вам нужно на практике (например, хотите ли вы включить в ссылку '!'?), но попробуйте следующее:
<?php
$text = "Walk! I went for a walk today. I like going walking. Let's go walk!";
$needles = array('go', 'walk');
foreach ($needles as $needle)
$text = preg_replace('/\b(' . $needle . ')\b/i', '<a href="#' . $needle . '">$1</a>', $text);
print $text;
function magicWords($words, $string) {
$from = $to = array();
foreach($words as $word) {
$from[] = "/\b$word\b/i"; // \b represents a word boundary
$to[] = '<a href="#' . strtolower($word) . '">${0}</a>';
}
return preg_replace($from, $to, $string);
}
$words = array('go', 'walk');
echo magicWords($words, "Lets go walking on a Walk");
Это выводит:
'Lets <a href="#go">go</a> walking on a <a href="#walk">Walk</a>.'
Обратите внимание, что он совпадает с "go" и "walk", но не с "walk", и поддерживает заглавную W на Walk, в то время как ссылка становится нижним регистром "#walk". Таким образом, "Walk walk Walk WALK wALk" будет содержать ссылку на #walk без изменения исходного формата.
.Чтобы подобрать каждое слово типа "walk", но не "walk" Используйте \b для ограничения слова.
Например, "\bwalk\b"
Попробуй что-нибудь вроде этого:
$words = array('walk','talk');
foreach($words as $word)
{
$word = preg_replace("/\b$word\b/","< a href='#$word' >$word< /a >",$word);
}
Я думаю, что Вы хотите, чтобы он был следующим.
<?php
$someText = 'I don\'t like walking, I go';
$words = array('walk', 'go');
$regex = '/\\b((' . implode('|',$words) . ')\\b(!|,|\\.|\\?)?)/i';
echo preg_replace_callback(
$regex,
function($matches) {
return '<a href=\'' . strtolower($matches[2]) . '\'>' . $matches[1] . '</a>';
},
$someText);
?>
Однако, несколько пунктов: