正则表达式:匹配句子中的单词 PHP

6

我有一个包含单词的数组,例如

$arr = array("go", "walk", ...)

我希望能够在句子中将这些词替换为链接。但是,只有在它们完全匹配时才应该替换(例如,“walk”应该与“Walk”或“walk!”匹配,但不应与“walking”匹配)。
替换应该是一个简单的链接,如:< a href='#walk' >walk< /a >
有人有想法吗?

例如,考虑这个句子:“我要去学校。我总是走路。” - Granit Luzhnica
5个回答

9
要匹配像“walk”而不是“walking”这样的单词,请使用\b表示单词边界。
例如:"\bwalk\b"

我尝试了这个例子:<?php $pattern = "\bwalk\b"; $replacement = "wwalk"; $text = "I do walk. I am walking. Let me walk!"; echo preg_replace( $pattern, $replacement, $text); ?> 但是我得到了以下错误: 警告:preg_replace():定界符不能是字母数字或反斜杠。 - Granit Luzhnica
你的模式需要分隔符,例如 $pattern = "/\bwalk\b/i"。i 量词使其不区分大小写。 - Residuum

4
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”,但不匹配“walking”,并保持Walk的大写字母,而链接变为小写字母“#walk”。
这样,“Walk walk WALK wALk”都将链接到#walk,而不影响原始格式。

3
尝试使用类似以下方式:
$words = array('walk','talk');

foreach($words as $word)
{
    $word = preg_replace("/\b$word\b/","< a href='#$word' >$word< /a >",$word);
}

1

我认为以下内容可能是你想要的。

<?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);
?>

然而需要注意以下几点:

  • 这个解决方案和其他所有解决方案都将匹配单词的任何出现,无论它们在元素属性中还是其他地方。
  • 我在结尾处添加了一些内容,以便进行标点符号匹配,如果您想在链接/锚标记中包含它。
  • 这需要php 5.3匿名函数。我认为这是一个有趣的替代方法,可以替代之前提到的foreach方法。

0

你的例子非常具体,因此很难确切知道你在实践中需要匹配什么(例如,您是否想在链接中包含“!”?),但请尝试以下内容:

<?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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接