Удалить символ во время функции preg_replace - PullRequest
0 голосов
/ 15 апреля 2011

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

$commentEntry = "@Bob1990 I think you are wrong...";
$commentText = preg_replace("/(@[^\s]+)/", "<a target=\"_blank\" href=\"http://www.youtube.com/comment_search?username=${1}$1\">$1</a>", $commentEntry);

Я хочу, чтобы результат был:

<a href="http://www.youtube.com/comment_search?username=Bob1990">@Bob1990</a> I think you are wrong...

Но я получаю:

 <a href="http://www.youtube.com/comment_search?username=@Bob1990">@Bob1990</a> I think you are wrong...

Я работал над этой одной проблемой, по крайней мере, час и почти потерял надежду, поэтому любая помощь очень ценится!

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

может попробовать что-то вроде этого

$commentText = preg_replace("/(@)([^\s]+)/", "<a target=\"_blank\" href=\"http://www.youtube.com/comment_search?username=$2\">$1$2</a>", $commentEntry);
0 голосов
/ 15 апреля 2011

Вы захватываете @ в своем шаблоне, поэтому он всегда будет выводиться при использовании $1. Попробуйте вместо этого:

$commentText = 
  preg_replace(
    "/@([^\s]+)/", 
    "<a target=\"_blank\" href=\"http://www.youtube.com/comment_search?username=$1\">@$1</a>", 
    $commentEntry
  );

Разница в том, что @ больше не захватывается как часть $1 (то есть он захватывает только Bob1990. Поскольку это буквальное значение, он не должен быть частью какого-либо шаблона. Я просто изменил его для вывода в виде литерального значения в тексте элемента, непосредственно перед захваченным именем (то есть теперь он делает <a>@$1</a>, а не просто <a>$1</a>).

0 голосов
/ 15 апреля 2011

Что вы можете сделать, это адаптировать захват. Переместите @ из фигурных скобок:

preg_replace("/@([^\s]+)/",

Затем вы можете написать свою строку замены как

'<a href="...$1">@$1</a>'

Обратите внимание, как первый $1 просто вставляет текст, а второй $1 дословно префиксируется @, чтобы вернуть его обратно.

...