0

我正在使用聊天机器人脚本,如果用户名是机器人将使用 mailto 链接test@test.com回复 @ 。<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);
4

2 回答 2

1

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

  • 它假定每个链接在“a”标签之后都具有“href”属性。如果前面有不同的属性怎么办?
  • 它假定“a”标签内没有其他 html 标签。如果链接中包含“强”标签,则链接将不匹配。
  • 我也很确定,如果列表中有多个链接,它将删除第一个链接和第二个链接之间的所有内容,因为它没有任何东西可以阻止它变得贪婪。
  • 最后,它没有被告知要麻木不仁。这意味着如果链接中包含 A HREF,则也不会找到该链接。

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

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

'i' 修饰符使其不敏感 's' 修饰符考虑到可能被换行符破坏的链接。

我总是建议使用不同格式、不同顺序等的不同链接填充一个字符串。这始终是测试工作正常的最佳方法。假设每个人都键入链接,因为我的测试会让你陷入很多棘手的情况:)

祝你好运!

于 2013-08-11T18:02:38.203 回答
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"
*/
?>
于 2013-08-11T15:37:29.147 回答