【问题标题】:Regex: Match words in sentence PHP正则表达式:匹配句子 PHP 中的单词
【发布时间】:2010-12-29 04:31:06
【问题描述】:

我有一个包含类似单词的数组

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

我想用它们在句子中匹配的链接替换这些词。但只有当它们完全匹配时才应该匹配(例如“walk”应该匹配“Walk”或“walk!”但不能匹配“walking”)

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

有人知道吗?

【问题讨论】:

  • 例如考虑这句话“我要去上学。我总是走路。”

标签: php regex arrays string


【解决方案1】:

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

例如,"\bwalk\b"

【讨论】:

  • 我试过这个例子: 但我得到:警告:preg_replace():分隔符不能是字母数字或反斜杠
  • 您需要在模式上使用分隔符,例如 $pattern = "/\bwalk\b/i"。 i 量词使其不区分大小写。
【解决方案2】:
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 上保持大写 W,而链接变为小写“#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);
    }
    

    【讨论】:

      【解决方案4】:

      我认为以下可能是您想要的。

      <?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 方法的一个有趣的替代方法

      【讨论】:

        【解决方案5】:

        您的示例非常具体,因此很难确切知道您在实践中需要匹配什么(例如,您想在链接中包含“!”吗?),但试试这个:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-23
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 2014-11-22
          • 1970-01-01
          • 1970-01-01
          • 2012-02-21
          相关资源
          最近更新 更多