эффективность preg_replace

Я использую preg_replace для функциональности типа модных слов, использую список модных слов, ищу их в статье, а затем использую preg_replace, чтобы обернуть вокруг них ссылку.

Мои модные словечки:

Online Marketing
Social Media Markeing
Social Media
Social
Brand Marketing
Brand
Search Engine Optimisation
SEO
Email Marketing
Email
Twitter
Facebook
LinkedIn

и я делаю preg_replace вот так...

$text = preg_replace("/Online Marketing/", "<a href='".$base."online-marketing/'>Online Marketing</a>", $text);

но проблема в том, что мне приходится делать preg_replace для каждого возможного варианта, например...

$text = preg_replace("/Online Marketing/", "<a href='".$base."online-marketing/'>Online Marketing</a>", $text);
$text = preg_replace("/Online marketing/", "<a href='".$base."online-marketing/'>Online marketing</a>", $text);
$text = preg_replace("/online marketing/", "<a href='".$base."online-marketing/'>online marketing</a>", $text);

Это очень многословно, теперь я знаю, что могу использовать массив с str_repalce следующим образом:

$from = array("Online Marketing", "Online marketing", "online marketing");
$name = str_replace($from, "", $text);

Но я не вижу способа найти, какая часть массива совпала, а затем заменить ее правильной ссылкой, поскольку вы можете видеть, что str_replace выше просто полностью удаляет мое модное слово, это просто пример.

Поэтому мне было интересно, сможет ли кто-нибудь помочь мне найти способ использования массива модных словечек в str_replace или preg_replace, а также убедиться, что он заменяет модное слово правильной ссылкой.

Надеюсь, кто-то может помочь


person lukehillonline    schedule 04.10.2011    source источник
comment
У меня сейчас все работает и готово, всем спасибо, завтра я опубликую код, показывающий, как я это сделал, так как мне нужно ждать 8 часов, потому что у меня всего 61 представитель.   -  person lukehillonline    schedule 04.10.2011


Ответы (4)


$test = preg_replace("/online marketing/i", "<a href='".$base."'online-marketing/'>$0</a>, $text);

Или, если сохранение капитализации не важно:

$test = str_ireplace("online marketing", "<a href='".$base."'online-marketing/'>online marketing</a>, $text);
person Niet the Dark Absol    schedule 04.10.2011
comment
Я так понимаю, /i будет искать строку во всех типах регистров? что с выходом? будет ли он распознавать, где находятся заглавные буквы, и выводить их в том же месте? - person lukehillonline; 04.10.2011
comment
$0 будет там, где ставится совпадение, регистр сохраняется. - person Niet the Dark Absol; 04.10.2011
comment
@AdriftUniform: Да, он заменит $0 совпавшей строкой, точно такой, какой она была. (Ps. Kolink, в ваших примерах отсутствуют двойные кавычки.) - person Ilmari Karonen; 04.10.2011
comment
блестяще спасибо! так что можно было бы сделать что-то вроде... $array = ("online marketing", "social media marketing", "brand marketing") preg_replace("/$array/i", "<a href='".$base."'online-marketing/'>$0</a>, $text); - person lukehillonline; 04.10.2011
comment
Вам нужно запускать foreach и preg_replace по одному модному слову за раз. - person Niet the Dark Absol; 04.10.2011

Функция preg_replace может получить второй массив замен. Если вы собираетесь использовать всегда один и тот же синтаксис, вы можете сделать цикл для создания ссылки (вместо того, чтобы писать ее самостоятельно каждый раз, когда вы хотите иметь элемент)

$base = 'base/';
$from = array("Online Marketing", "Online test", "offline test");
$to = array();
foreach($from AS $key=>$f) {
   $from[$key] = "/".$f."/";    
   $to[$key]="<a href='".$base.$f."/'>online marketing</a>";
}
$string = 'this is a test using Online Marketing and offline test';
$text = preg_replace($from, $to, $string);
person dyesdyes    schedule 04.10.2011
comment
Я вижу, что ты здесь делаешь, но я не думаю, что это совсем то, что я ищу, спасибо - person lukehillonline; 04.10.2011

Вы можете использовать str_ireplace() с массивами (что является заменой строки совпадения без учета регистра), поэтому, если будет найдено определенное совпадение, оно заменит его соответствующей заменой в другом массиве.

EG:

$needles = array("Online Marketing", "Online Games", "Online Shopping");

$replacements = str_replace('<a href="online_marketing.html>Online Marketing</a>"',
                             '<a href="online_games.html">Online Games</a>',
                             '<a href="online_shopping.html">Online Shopping</a>');

    $replaced = str_ireplace($needles, $replacements);

    // Show the replaced text
    echo $replaced;
);
person Luke    schedule 04.10.2011
comment
мне нужно, чтобы он был чувствителен к регистру, поэтому я буду использовать pre_replace (/.../i, , $text); - person lukehillonline; 04.10.2011

Я взял смесь всех ваших ответов, и это мой конечный результат...

$Fbuzzwords = array(" online marketing", " social media marketing", " social-media-marketing", " social media", 
                " social", " brand marketing", " brand", " search engine optimisation", " seo", " email marketing", 
                " email", " e-mail marketing", " e-mail", " tiwtter", " facebook", " linkedin");

$Ubuzzwords = array("online-marketing", "social-media-marketing", "social-media-marketing", "social-media-marketing", 
                "social-media-marketing", "brand-marketing", "brand-marketing", "search-engine-optimisation", 
                "search-engine-optimisation", "online-marketing", "online-marketing", "online-marketing", 
                "online-marketing", "social-media-marketing", "social-media-marketing", "social-media-marketing");

$i = 0;

foreach ($Fbuzzwords as $buzzword)
{
    $url = $Ubuzzwords[$i];

    $Rbuzzwords = array(" <a href='".$base.$url."/'>online marketing</a>", " <a href='"
.$base.$url."/'>social media marketing</a>", 
                " <a href='".$base.$url."/'>social-media-marketing</a>", " <a href='".$base.$url."/'>social media</a>", 
                " <a href='".$base.$url."/'>social</a>", " <a href='".$base.$url."/'>brand marketing</a>", 
                " <a href='".$base.$url."/'>brand</a>", " <a href='".$base.$url."/'>search engine optimisation</a>", 
                " <a href='".$base.$url."/'>seo</a>", " <a href='".$base.$url."/'>email marketing</a>", 
                " <a href='".$base.$url."/'>email</a>", " <a href='".$base.$url."/'>e-mail marketing</a>", 
                " <a href='".$base.$url."/'>e-mail</a>", " <a href='".$base.$url."/'>tiwtter</a>", 
                " <a href='".$base.$url."/'>facebook</a>", " <a href='".$base.$url."/'>linkedin</a>");

    $replacement = $Rbuzzwords[$i];

    $text = preg_replace("/$buzzword/i", "$replacement", $text);

    $i++;
}

Итак, у меня есть 3 массива: 1 для поиска слова на странице и 2 для URL-адреса, я перебираю весь текст для каждой части массива, чтобы убедиться, что я улавливаю каждый случай.

person lukehillonline    schedule 05.10.2011