【问题标题】:regex help for replace word with hyperlink用超链接替换单词的正则表达式帮助
【发布时间】:2016-07-27 11:14:12
【问题描述】:

我有这样的字符串

"this TEST-001 is test TEST-001string TEST-001"

所以我需要用这样的超链接来包装所有的TEST-001

我已经尝试过了,但它会将超链接应用于所有匹配的字符。

$re1='(TEST)';  # Word 1
$re2='(-)'; # Any Single Character 1
$re3='(\d+)';   # Integer Number 1

echo preg_replace("/([".$re1.$re2.$re3."])/", "<a href=/$1>$1</a>", $txt);

【问题讨论】:

  • 删除 [] 并使用 $0 代替 $1

标签: php regex preg-replace str-replace


【解决方案1】:

您使用[] 创建了一个字符类,这些应该被删除。实际上,您正在创建太多的捕获组,它们都是多余的。

你可以使用这个简化的代码:

$txt = "this TEST-001 is test TEST-001string TEST-001";
$re1='TEST';  # Word 1
$re2='-'; # Any Single Character 1
$re3='\d+';   # Integer Number 1
echo preg_replace("/$re1$re2$re3/", "<a href=/$0>$0</a>", $txt);

IDEONE demo

请注意,整个匹配可以使用替换字符串中的$0 反向引用来反向引用,因此,不需要用额外的捕获组包装整个模式(不像在 Perl 旧版本中 $&amp; 相同的反向引用导致性能问题)。

【讨论】:

【解决方案2】:

问题是 [.删除它们我现有的代码看起来像一个魅力

$re1='(TEST)';  # Word 1
$re2='(-)'; # Any Single Character 1
$re3='(\d+)';   # Integer Number 1

echo preg_replace("/(".$re1.$re2.$re3.")/", "<a href=/$1>$1</a>", $txt);

【讨论】:

  • 您使用不使用的捕获组使模式过载。请看我的回答。此外,您可以在双引号字符串文字中使用字符串插值,这样可以稍微缩短代码。此外,无需在整个模式和$1 周围使用捕获组,您可以使用$0 反向引用。
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2011-05-27
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多