0

私はチャット ボット スクリプトを使用しています。ユーザー名がtest@test.comボットの場合、@<a href= mailto:test@test.com>test@test.com</a>に mailto リンクを返信します。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 タグがないことを前提としています。リンクに「strong」タグが含まれている場合、リンクは一致しません。
  • リストに複数のリンクがある場合、最初のリンクと2番目のリンクの間のすべてが削除されると確信しています。貪欲になるのを止めるものがないからです。
  • 最後に、鈍感であるとは言われていません。これは、リンクに A HREF が含まれている場合、それも見つからないことを意味します。

私のソリューションが 100% 安全だと言っているわけではありませんが、私が認識しているシナリオでテストしたところ、上記の回答からのアップグレードだと思います!...

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

'i' 修飾子は、それを区別しません 's' 修飾子は、改行で壊れる可能性があるリンクを考慮に入れます。

さまざまな形式、さまざまな順序などでさまざまなリンクを文字列に入力することを常にお勧めします。これは、動作をテストするための常に最良の方法です。eveyone タイプのリンクを My test と仮定すると、多くの厄介な状況に陥ります :)

幸運を!

于 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 に答える