Regex: cümle PHP kelimler

5 Cevap php

Ben gibi sözlerle bir dizi var

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

Ben onlar cümle eşleştirilir f bağlantıları ile bu kelimeleri değiştirmek istiyoruz. Ama ("! Walk" Örneğin "yürüyüş" için "Walk" maç ya da olmalı ama aynı zamanda "yürüyüş" değil) bunlar tam olarak eşleşen yalnızca olmalı

< a href='#walk' >walk< /a >: Ve değiştirme gibi basit bir bağlantı olmalıdır

Herkes herhangi bir fikir?

5 Cevap

"Yürüyüş" ama kelime bounday için kullanın \ b "yürüyüş" değil gibi, her bir kelime Maç için.

Örneğin, "\bwalk\b"

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

Bu çıkışlar:

'Lets <a href="#go">go</a> walking on a <a href="#walk">Walk</a>.'

O "git" ve "yürüyüş", ama "yürüyüş" değil maçlar ve bağlantı küçük harf "# yürüyüş" olurken Walk başkenti W bakımını unutmayın.

Bu şekilde, "Yürüyüş yürüyüş Walk" # için tüm bağlantı özgün biçimlendirme etkilemeden yürüyecek.

Ben şu istediğini olabileceğini düşünüyorum.

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

Olsa puan birkaçı:

  • Bu çözüm ve tüm diğerleri kelimenin herhangi oluşumları elemanı niteliklerine onlar olabilir ya da ne olursa olsun maç olacak
  • Ben size link / bağlantı etiketlerine içinde bunu dahil etmek istesin noktalama eşleştirme için ucunda biraz ekledik.
  • Bu PHP 5.3 anonim fonksiyonları gerektirir. Ben bu sözü foreach yöntemlere ilginç bir alternatif oldu tought

Foto: Böyle bir şey deneyin

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

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

Sizin örnekler oldukça özeldir, bu nedenle (örn. dahil etmek istiyoruz bağlantı '!?) Pratikte maç, ama bu denemek için gereken tam olarak bilmek zor:

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