如何使用preg_replace从PHP字符串中删除链接

时间:2013-08-11 15:20:07

标签: php preg-replace str-replace

我正在使用聊天机器人脚本,如果用户名为test@test.com,机器人将使用mailto链接回复@ <a href= mailto:test@test.com>test@test.com</a>。我希望回复只有test@test.com没有链接,我尝试了preg_replacestr_replace,但我真的不知道要使用的确切代码,我尝试了以下但没有工作!

$name = preg_replace('/<a href="([^<]*)">([^<]*)<\/a>/', '', $name);

我用于替换的整个代码是:

$name = str_replace (chr(0xc2).chr(0xa0), "_", $name);
$name = str_replace ("'", "", $name);
$name = str_replace ("&quot;", '"', $name);
$name = str_replace ("&amp;", "&", $name);
$name = str_replace ("&lt;", "", $name);
$name = str_replace ("&gt;", "", $name);
$name = str_replace ("&", "_", $name);
$name = str_replace ("*", "_", $name);
$name = preg_replace('/[^ \p{L}\p{N} \@ \_ \- \.\#\$\&\!]/u', '', $name);
$name = preg_replace('/<a href="([^<]*)">([^<]*)<\/a>/', '', $name);

2 个答案:

答案 0 :(得分:1)

为什么要替换它?只需使用preg_match()和类似的正则表达式:

<a href=[^>]+>([^<]*)</a>

总的来说,你的代码看起来像这样

<?php
$regex = '#<a href=[^>]+>([^<]*)</a>#';
$email = '<a href= mailto:test@test.com>test@test.com</a>';

preg_match($regex, $email, $matches);
var_dump($matches[1]);
/*
output:
string(13) "test@test.com"
*/
?>

答案 1 :(得分:1)

上面的答案在做preg_replace时做了很多假设,所以不幸的是它会失败:(这就是为什么......

  • 假设每个链接都在'a'标记后面直接包含'href'属性。如果前面有不同的属性怎么办?
  • 假设'a'标签内没有其他html标签。如果链接中包含“强”标记,则链接将不匹配。
  • 我也非常肯定,如果列表中有多个链接,它将删除第一个链接和第二个链接之间的所有内容,因为它没有任何东西可以阻止它贪婪。
  • 最后,它没有被告知不敏感。这意味着如果链接中包含A HREF,则也无法找到。

我不是说我的解决方案是100%安全的,但我已经在我知道的情况下对其进行了测试,我认为这是上述答案的升级!...

$email = preg_replace("/<a.+?href.+?>.+?<\/a>/is","",$email);

'i'修饰符使其不敏感 's'修饰符会考虑可能因换行符而中断的链接。

我总是建议使用不同格式,不同订单等不同链接填充字符串。这始终是测试工作的最佳方式。假设eveyone键入链接,因为我的测试会让你陷入许多棘手的情况:)

祝你好运!