1

こんにちは、再び Stackoverflow!

relandtargetタグを削除して、URL を相対にしたいと思います。

私の入力文字列は

<a href="http://example.com/relative/path/" rel="external" target="_blank">Link</a>
<a href="http://example.com/relative/path" rel="external" target="_blank">Link</a>

そして、私が達成したいのはこれです:

<a href="relative/path">Link</a>
<a href="relative/path/">Link</a>

だから私がしたことは:

$string = preg_replace("_<a href=\"http://example.com/(*.?)\" target=\"\_blank\" rel=\"external\">_si", "<a href=\"http://example.com/$1\">", $string);

しかし、正規表現は間違っていることが判明しました。誰かが私に何が問題なのかを説明し、正しい解決策を教えてもらえますか?

HTML を解析するために正規表現を使用すべきではないことはわかっていますが、文字列内で数回一致する場合は、そのほうが簡単だと考えました。

前もって感謝します!

4

5 に答える 5

1

正規表現では、次のタグ (target、rel) の順序が間違っています。これにより、それらすべてが任意の順序で削除されます。

$string = preg_replace("_<a href=\"http://example\.com/(.+?)\"((\w+=\".+?\")|\s*)*>_si", "<a href=\"$1\">", $string);
于 2013-11-06T22:20:38.143 に答える
0

あなたはほとんどそこにいました。

$string = preg_replace('@<a href="http://example.com/(.*)" (?:.*)>(.*)</a>@U',
                        '<a href="$1">$2</a>', $string);

Uフラグはそれを貪欲にしないので、最初のもの(.*)はあまり一致しません。は(?:.*)、 に一致する非キャプチャ グループですrel="external" target="_blank"が、無視されます。

より堅牢にするために、パターンを少し変更できます。

@<a(?:.*)href="http://example.com/(.*)"(?:.*)>(.*)</a>@U
于 2013-11-06T22:22:53.903 に答える
0

スクリプトをどの程度動的にするかはわかりませんが、次の正規表現パターンを試すことができます。

/\s?(rel|target)=".+?"|http(s*)://[a-z0-9|.]+/

これは、値に関係なく rel 属性と target 属性に一致し、URL のプロトコルとドメインの部分にも一致します。繰り返しますが、達成したいことを指定すると、より適切なパターンを提案できます。

于 2013-11-06T22:22:08.583 に答える
0

私はこれを解決しました:

<?php
$string = '<a href="http://example.com/relative/path/" rel="external" target="_blank">Link</a>
<a href="http://example.com/relative/path" rel="external" target="_blank">Link</a>
';
//
$string = preg_replace("#<a href=\"http://example.com/(.*)\" rel=\"external\" target=\"_blank\">#i",
  "<a href=\"/$1\">", $string);
//
echo "<textarea style=\"width: 700px; height: 300px;\">";
echo $string;
echo "</textarea>";
?>

あなたのエラーは

(*.?) that should be (.*)
于 2013-11-06T22:28:42.027 に答える
-1

これは、PHP 上の jQuery を使用して簡単に実現できます。

$("a").each(function(){
    $(this).removeAttr('rel');
    $(this).removeAttr('target');
});

PHPでこれを達成するための最良の方法が何であるかはわかりません。

于 2013-11-06T22:14:02.013 に答える