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

时间:2009-12-22 16:42:55

标签: php regex arrays string

我有一个像

这样的单词的数组
$arr = array("go", "walk", ...)

我想用句子中匹配的链接替换这些单词。但它应该只是它们完全匹配(例如“walk”应该匹配“Walk”或“walk!”而不是“walk”)

替换应该是一个简单的链接,如:< a href='#walk' >walk< /a >

任何人有什么想法吗?

5 个答案:

答案 0 :(得分:8)

匹配每个单词,如“walk”但不是“walking”使用\ b作为单词边界。

例如,"\bwalk\b"

答案 1 :(得分: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”,但不是“行走”,并且在链接变为小写“#walk”时保持大写W on Walk。

这样,“Walk walk WALK wALk”将全部链接到#walk,而不会影响原始格式。

答案 2 :(得分:2)

尝试这样的事情:

$words = array('walk','talk');

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

答案 3 :(得分: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方法的一个有趣的替代方案

答案 4 :(得分: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;