链接

时间:2015-11-20 19:15:02

标签: php regex preg-replace

所以我的网站上有一个@mentions函数,用户可以自行输入,但可以执行某些操作:

  

@foo Hello这是一些提及的文字。

我想删除文本(@foo之后的所有内容)内容来自streamitem_content

$json['streamitem_content_usertagged'] =
preg_replace('/(^|\s)@(\w+)/', '\1@<a href="profile.php?username=$1">$1</a>',
$json['streamitem_content']); 

3 个答案:

答案 0 :(得分:2)

试一试

$json['streamitem_content'] = '@foo Hello This is some mention text included.';
$json['streamitem_content_usertagged'] =
preg_replace('/@(\w+)/', '@<a href="profile.php?username=$1">$1</a>',
$json['streamitem_content']);
echo $json['streamitem_content_usertagged'];

输出:

@<a href="profile.php?username=foo">foo</a> Hello This is some mention text included.

Preg_replace只会替换它找到的内容,因此您无需查找您不感兴趣的内容。如果您确实希望捕获字符串的多个部分,但捕获组在每个组()之后增加1。所以这个

preg_replace('/(^|\s)@(\w+)/', '$1@<a href="profile.php?username=$2">$2</a>',
$json['streamitem_content']);  
echo $json['streamitem_content_usertagged'];

实际上是

preg_replace('/(^|\s)@(\w+)/', '$1@<a href="profile.php?username=$2">$2</a>',
$json['streamitem_content']);

<强>更新

$json['streamitem_content'] = '@foo Hello This is some mention text included.';
$json['streamitem_content_usertagged'] =
preg_replace('/@(\w+).*$/', '@<a href="profile.php?username=$1">$1</a>',
$json['streamitem_content']);
echo $json['streamitem_content_usertagged'];

输出:

@<a href="profile.php?username=foo">foo</a>

如果@foo后要替换的内容可以扩展为多行,请使用s modifier

Regex101演示:https://regex101.com/r/tX1rO0/1

因此,正则表达式说找到@然后捕获所有连续a-zA-Z0-9_个字符。在那些连续字符后,我们不在乎字符串的结尾。

答案 1 :(得分:0)

您可以使用:

preg_replace('/^\s*@(\w+)/', '<a href="profile.php?username=$1">@$1</a>',
             $json['streamitem_content']);  

这将删除前导空格,并在超链接的文本中包含@(不是链接参数)。

如果你需要保持领先的白色空间:

preg_replace('/^(\s*)@(\w+)/', '$1<a href="profile.php?username=$2">@$2</a>',
             $json['streamitem_content']);  

答案 2 :(得分:0)

您可以使用explode();str_replace();。他们可能比preg具有速度优势。

假设该行可用作变量(例如$mention):

  $mention = $json['streamitem_content'];

  $mention_parts = explode(" ", $mention);
  $the_part_you_want = str_replace('@','', $mention_parts[0]);
   // or you could use $the_part_you_want = ltrim($mention_parts[0], '@');

  $json['streamitem_content_usertagged'] = '@<a href="profile.php?username=' . $the_part_you_want . '">' . $mention_parts[0] . '</a>';

或使用trim($mention_parts[0]);删除任何不需要的空格。

你可以使用更少的变量并重用$mention作为数组,但这似乎是一种更清晰的方式来说明原理。