Заменить имена в тексте ссылками - PullRequest
1 голос
/ 22 июня 2010

Я хочу заменить имена в тексте ссылкой на свой профиль.

$text = "text with names in it (John) and Jacob.";
$namesArray("John", "John Plummer", "Jacob", etc...);
$LinksArray("<a href='/john_plom'>%s</a>", "<a href='/john_plom'>%s</a>", "<a href='/jacob_d'>%s</a>", etc..);
//%s shout stay the the same as the input of the $text.

Но при необходимости можно изменить массив.

Теперь я использую 2 массива в str_replace. как это $text = str_replace($namesArray, $linksArray, $text); но заменяющий крик работает на имя с «точкой» или «)» или любой другой вещью в конце или начале. Как я могу получить замену для работы над текстом, как это.

Выходной крик будет "text with names in it (<a.....>John</a>) and <a ....>Jacob</a>."

Ответы [ 4 ]

1 голос
/ 22 июня 2010

Готово, без регулярных выражений:

$text = "text with names in it (John) and Jacob.";
$name_link = array("John" => "<a href='/john_plom'>", 
  "Jacob" => "<a href='/jacob'>"); 
foreach ($name_link as $name => $link) {
  $tmp = explode($name, $text);
  if (count($tmp) > 1) {
    $newtext = array($tmp[0], $link, $name, "</a>",$tmp[1]);
    $text = implode($newtext);
  }
}
echo $text;

Ссылки никогда не изменятся для каждого заданного ввода, поэтому я не уверен, понял ли я ваш вопрос.Но я проверил это, и это работает для данной строки.Чтобы расширить его, просто добавьте больше записей в массив $name_link.

1 голос
/ 22 июня 2010

Вот пример для одного имени, вам нужно будет повторить это для каждого элемента в вашем массиве:

$name = "Jacob";
$url = "<a href='/jacob/'>$1</a>";
$text = preg_replace("/\b(".preg_quote($name, "/").")\b/", $url, $text);
1 голос
/ 22 июня 2010

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

$name = 'John';
$new_string = preg_replace('/[^ \t]?'.$name.'[^ \t]/', $link, $old_string);

PHP preg_replace принимает смешанный шаблон и тему, другими словами, вы можете предоставить массив таких шаблонов и массив замен.

0 голосов
/ 22 июня 2010

Ищите регулярные выражения.Что-то вроде preg_replace () .

preg_replace('/\((' . implode('|', $names)  . ')\)/', 'link_to_$1', $text);

Обратите внимание, что это решение принимает массив имен, а не только одно имя.

...