1

からすべての属性と属性preg_replaceをクリアし、それらを他の値に置き換える必要がある関数を使用します。ここにあります:reltarget$body

    $patterns = array();
    $patterns[] = '/<a(.*) rel="([^"]*)"(.*)>/';
    $patterns[] = '/<a(.*) target="([^"]*)"(.*)>/';
    $patterns[] = '/<a(.*)>/';

    $replacements = array();
    $replacements[] = '<a$1$3>';
    $replacements[] = '<a$1$3>';
    $replacements[] = '<a rel="nofollow" target="_blank"$1>';

    $body = preg_replace($patterns,$replacements,$body);

問題は、単一引用符と引用符なしが一致しないことです。relまた、リンクから属性と属性をクリアして他の属性と設定するためのより良いアプローチがある場合はtarget、アドバイスしてください。

ありがとう

編集$body::

    $body = '<a href="TEST">Link1</a>
      <a href="TEST" rel=\'lqlqlq\'>Link2</a>
      <a href="TEST" target="_blank" rel="lqlqlq">Link3</a>
              <a href="TEST" target=_blank rel=lqlqlq>Link4</a>';

また、テキストによるリンクを機能させるための他のすべてのオプションはユーザー定義であり、おそらく一部のユーザーはごまかそうとしています。私の目標-ユーザーが何を入力したかに関係なく、すべてのリンク$bodyが定義されrel、属性を持つようになります。target

4

3 に答える 3

1

同時に他のものと一致させたくない場合は、システムリソースを維持しないことをお勧めします。

$patterns[] = "/rel=[\"\']?([\w]+)[\"\']?/";
$patterns[] = "/target=[\"\']?([_a-zA-Z]+)[\"\']?/"

私はREGEXが得意ではありませんが、私が知る限り、これにより時間を節約できます。

于 2012-09-13T08:08:17.737 に答える
0

ほとんどの場合、それらと一致しますが<a(.*)>、最初の2つが何をしたかに関係なく常に一致するため、最初の2つのパターンからは結果が得られません。

これはあなたが探していることをすることができます:

$patterns = array();
$patterns[] = '/<a(.*) rel=[\'"]?\S+[\'"]? (.*)>/';
$patterns[] = '/<a(.*) target=[\'"]?\S+[\'"]? (.*)>/';

$replacements = array();
$replacements[] = '<a$1$3>';
$replacements[] = '<a$1$3>';

$body = preg_replace($patterns,$replacements,$body);

乾杯。

于 2012-09-13T07:55:24.557 に答える
0

この式は3つのオプションを処理します。

  1. 引用符なし
  2. 二重引用符
  3. 一重引用符

'/ href = ["\']?([^" \'>] +)[" \']?/ '

于 2013-08-02T14:58:41.483 に答える