Regex: сопоставить слова в предложении PHP - PullRequest
5 голосов
/ 22 декабря 2009

У меня есть массив со словами вроде

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

Я хотел бы заменить эти слова ссылками, если они совпадают в предложениях. Но это должно быть только в том случае, если они точно совпадают (например, "прогулка" должна соответствовать "прогулке" или "прогулке!", Но не также "прогулке")

А замена должна быть простой ссылкой типа: < a href='#walk' >walk< /a >

Кто-нибудь есть идеи?

Ответы [ 5 ]

8 голосов
/ 22 декабря 2009

Чтобы сопоставить каждое слово как "прогулка", но не "прогулка", используйте \ b для границы слов.

Например, "\bwalk\b"

4 голосов
/ 22 декабря 2009
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 без изменения исходного форматирования.

2 голосов
/ 22 декабря 2009

Попробуйте что-то вроде этого:

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

foreach($words as $word)
{
    $word = preg_replace("/\b$word\b/","< a href='#$word' >$word< /a >",$word);
}
1 голос
/ 22 декабря 2009

Я думаю, что следующее может быть тем, что вы хотите.

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

Несколько моментов:

  • Это решение и все остальные будут соответствовать любым вхождениям слова, будь то в атрибутах элемента или как угодно
  • В конце я добавил немного для соответствия пунктуации, если вы хотите включить его в теги link / anchor.
  • Для этого требуются анонимные функции php 5.3. Я подумал, что это интересная альтернатива упомянутым методам foreach
0 голосов
/ 22 декабря 2009

Ваши примеры довольно специфичны, поэтому трудно точно знать, что вам нужно на практике сопоставить (например, вы хотите включить в ссылку «!»?), Но попробуйте это:

<?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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...